From 8c2cedefe40d089aaa5001515656629c440359ea Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:05:36 +0200 Subject: [PATCH] Refactor migrations to account for 2.1-preview users --- ...e_image_uniques_and_rename_constraints.sql | 160 ++++++++---------- .../V2.1.0.2__Create_game_requests_table.sql | 27 ++- 2 files changed, 88 insertions(+), 99 deletions(-) diff --git a/app/src/main/resources/db/migration/V2.1.0.1__Drop_game_image_uniques_and_rename_constraints.sql b/app/src/main/resources/db/migration/V2.1.0.1__Drop_game_image_uniques_and_rename_constraints.sql index 910e969..f1e776b 100644 --- a/app/src/main/resources/db/migration/V2.1.0.1__Drop_game_image_uniques_and_rename_constraints.sql +++ b/app/src/main/resources/db/migration/V2.1.0.1__Drop_game_image_uniques_and_rename_constraints.sql @@ -1,7 +1,32 @@ -- Flyway Migration: V2.1.0 (Part 1) -- Purpose: -- 1. Drop unique constraints on GAME.COVER_IMAGE_ID and GAME.HEADER_IMAGE_ID --- 2. Rename all remaining UK*/FK* constraints to human-readable names +-- 2. Rename all remaining UK*/FK* constraints to human-readable names (idempotent) +-- This version has been updated to be resilient: if a hashed constraint name +-- does not exist (e.g. on legacy schemas where Hibernate never created it, or +-- on future fresh installs where the friendly name may already be present), +-- the rename attempt is ignored instead of failing the migration. + +/****************************************************************************************** + * Helper: Idempotent constraint rename for H2 + * H2 does not support RENAME CONSTRAINT IF EXISTS, so we create a Java alias that + * executes a rename and suppresses error 90057 (constraint not found). + * NOTE: Do not declare method as public static; H2 wraps it and adds modifiers itself. + ******************************************************************************************/ +CREATE ALIAS IF NOT EXISTS RENAME_CONSTRAINT_IF_EXISTS AS +$$ +import java.sql.*; +@CODE +void run(Connection conn, String table, String oldName, String newName) throws SQLException { + try (Statement st = conn.createStatement()) { + st.execute("ALTER TABLE " + table + " RENAME CONSTRAINT " + oldName + " TO " + newName); + } catch (SQLException e) { + if (e.getErrorCode() != 90057) { // ignore only 'constraint not found' + throw e; + } + } +} +$$; /****************************************************************************************** * 1. Drop the two unwanted unique constraints on GAME @@ -13,109 +38,74 @@ ALTER TABLE GAME -- HEADER_IMAGE_ID unique /****************************************************************************************** - * 2. Rename remaining UNIQUE constraints (UK*) + * 2. Rename remaining UNIQUE constraints (UK*) (tolerant) ******************************************************************************************/ -ALTER TABLE COMPANY - RENAME CONSTRAINT UK4UCNYHR8I0URHWDUDFAHKOB9E TO UQ_COMPANY_NAME_TYPE; -ALTER TABLE DIRECTORY_MAPPING - RENAME CONSTRAINT UKJ3GSATFAHEWFOLSEAJ29O3KYT TO UQ_DIRECTORY_MAPPING_INTERNAL_PATH; -ALTER TABLE GAME - RENAME CONSTRAINT UK4WXN9FPXFQ8QXPSB7FY0O3NOA TO UQ_GAME_PATH; -ALTER TABLE GAME_IMAGES - RENAME CONSTRAINT UKBDE7M3TKHIEEYBINM2ED0B6X1 TO UQ_GAME_IMAGES_IMAGE_ID; -ALTER TABLE LIBRARY_DIRECTORIES - RENAME CONSTRAINT UKB5UM4CADBNC6UC8DVOMO81N5F TO UQ_LIBRARY_DIRECTORIES_DIRECTORY_ID; -ALTER TABLE LIBRARY_GAMES - RENAME CONSTRAINT UK3E4VB9NQXPY27VMTA27GU5FY8 TO UQ_LIBRARY_GAMES_GAME_ID; -ALTER TABLE USERS - RENAME CONSTRAINT UK6DOTKOTT2KJSP8VW4D0M25FB7 TO UQ_USERS_EMAIL; -ALTER TABLE USERS - RENAME CONSTRAINT UKR43AF9AP4EDM43MMTQ01ODDJ6 TO UQ_USERS_USERNAME; -ALTER TABLE USERS - RENAME CONSTRAINT UKRSULCN2GYNJY3CDDPWMOSV881 TO UQ_USERS_AVATAR_ID; -ALTER TABLE GAME_FIELD_METADATA - RENAME CONSTRAINT UKHW6U2Y9FLWPTI57QB7K0P27BL TO UQ_GAME_FIELD_METADATA_SOURCE_ID; -ALTER TABLE GAME_FIELDS - RENAME CONSTRAINT UK1L5OAH0UOOUV4V5A9P0PAK77X TO UQ_GAME_FIELDS_FIELD_METADATA_ID; +CALL RENAME_CONSTRAINT_IF_EXISTS('COMPANY', 'UK4UCNYHR8I0URHWDUDFAHKOB9E', 'UQ_COMPANY_NAME_TYPE'); +CALL RENAME_CONSTRAINT_IF_EXISTS('DIRECTORY_MAPPING', 'UKJ3GSATFAHEWFOLSEAJ29O3KYT', + 'UQ_DIRECTORY_MAPPING_INTERNAL_PATH'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME', 'UK4WXN9FPXFQ8QXPSB7FY0O3NOA', 'UQ_GAME_PATH'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_IMAGES', 'UKBDE7M3TKHIEEYBINM2ED0B6X1', 'UQ_GAME_IMAGES_IMAGE_ID'); +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_DIRECTORIES', 'UKB5UM4CADBNC6UC8DVOMO81N5F', + 'UQ_LIBRARY_DIRECTORIES_DIRECTORY_ID'); +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_GAMES', 'UK3E4VB9NQXPY27VMTA27GU5FY8', 'UQ_LIBRARY_GAMES_GAME_ID'); +CALL RENAME_CONSTRAINT_IF_EXISTS('USERS', 'UK6DOTKOTT2KJSP8VW4D0M25FB7', 'UQ_USERS_EMAIL'); +CALL RENAME_CONSTRAINT_IF_EXISTS('USERS', 'UKR43AF9AP4EDM43MMTQ01ODDJ6', 'UQ_USERS_USERNAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('USERS', 'UKRSULCN2GYNJY3CDDPWMOSV881', 'UQ_USERS_AVATAR_ID'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELD_METADATA', 'UKHW6U2Y9FLWPTI57QB7K0P27BL', + 'UQ_GAME_FIELD_METADATA_SOURCE_ID'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELDS', 'UK1L5OAH0UOOUV4V5A9P0PAK77X', 'UQ_GAME_FIELDS_FIELD_METADATA_ID'); /****************************************************************************************** - * 3. Rename FOREIGN KEY constraints (FK*) + * 3. Rename FOREIGN KEY constraints (FK*) (tolerant) ******************************************************************************************/ -ALTER TABLE GAME - RENAME CONSTRAINT FK6CVB43REAYSNYPI0XDY6HQTVF TO FK_GAME_COVER_IMAGE; -ALTER TABLE GAME - RENAME CONSTRAINT FK8N86NDPGKMOO7YOLX6HL8N84G TO FK_GAME_HEADER_IMAGE; -ALTER TABLE GAME - RENAME CONSTRAINT FKIUVR8XFB63T1K6T43EYYXVO2C TO FK_GAME_LIBRARY; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME', 'FK6CVB43REAYSNYPI0XDY6HQTVF', 'FK_GAME_COVER_IMAGE'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME', 'FK8N86NDPGKMOO7YOLX6HL8N84G', 'FK_GAME_HEADER_IMAGE'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME', 'FKIUVR8XFB63T1K6T43EYYXVO2C', 'FK_GAME_LIBRARY'); -ALTER TABLE GAME_DEVELOPERS - RENAME CONSTRAINT FKB12PO9L2B9OJBAIHC82MM2QXB TO FK_GAME_DEVELOPERS_COMPANY; -ALTER TABLE GAME_DEVELOPERS - RENAME CONSTRAINT FKS4IJSVPIJ53DSL143XVRGBS09 TO FK_GAME_DEVELOPERS_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_DEVELOPERS', 'FKB12PO9L2B9OJBAIHC82MM2QXB', 'FK_GAME_DEVELOPERS_COMPANY'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_DEVELOPERS', 'FKS4IJSVPIJ53DSL143XVRGBS09', 'FK_GAME_DEVELOPERS_GAME'); -ALTER TABLE GAME_FEATURES - RENAME CONSTRAINT FK63XLTCT60SCIMPM06K8BHBE4A TO FK_GAME_FEATURES_GAME; -ALTER TABLE GAME_GENRES - RENAME CONSTRAINT FKDTSX09YOPD98E0LUEWRUSJD9E TO FK_GAME_GENRES_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FEATURES', 'FK63XLTCT60SCIMPM06K8BHBE4A', 'FK_GAME_FEATURES_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_GENRES', 'FKDTSX09YOPD98E0LUEWRUSJD9E', 'FK_GAME_GENRES_GAME'); -ALTER TABLE GAME_IMAGES - RENAME CONSTRAINT FK5YWV1DMXCM2VSQUEB7RHQ3JK9 TO FK_GAME_IMAGES_IMAGE; -ALTER TABLE GAME_IMAGES - RENAME CONSTRAINT FKOWCPUCV45OX8GT28TXGVHF1AA TO FK_GAME_IMAGES_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_IMAGES', 'FK5YWV1DMXCM2VSQUEB7RHQ3JK9', 'FK_GAME_IMAGES_IMAGE'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_IMAGES', 'FKOWCPUCV45OX8GT28TXGVHF1AA', 'FK_GAME_IMAGES_GAME'); -ALTER TABLE GAME_KEYWORDS - RENAME CONSTRAINT FKMVF6HNJ7ROMQQM2EX70A9NVAC TO FK_GAME_KEYWORDS_GAME; -ALTER TABLE GAME_PERSPECTIVES - RENAME CONSTRAINT FKHUEENG29Y1GHBRDI5QHGUXH6E TO FK_GAME_PERSPECTIVES_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_KEYWORDS', 'FKMVF6HNJ7ROMQQM2EX70A9NVAC', 'FK_GAME_KEYWORDS_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_PERSPECTIVES', 'FKHUEENG29Y1GHBRDI5QHGUXH6E', 'FK_GAME_PERSPECTIVES_GAME'); -ALTER TABLE GAME_PUBLISHERS - RENAME CONSTRAINT FK49R2KB61LIJ54BQB4VNTST97N TO FK_GAME_PUBLISHERS_GAME; -ALTER TABLE GAME_PUBLISHERS - RENAME CONSTRAINT FKNGLD5ESGRBRH95J5BJF0HEF85 TO FK_GAME_PUBLISHERS_COMPANY; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_PUBLISHERS', 'FK49R2KB61LIJ54BQB4VNTST97N', 'FK_GAME_PUBLISHERS_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_PUBLISHERS', 'FKNGLD5ESGRBRH95J5BJF0HEF85', 'FK_GAME_PUBLISHERS_COMPANY'); -ALTER TABLE GAME_THEMES - RENAME CONSTRAINT FKRV351JXLIOY0A17Y5BBJJ6FW4 TO FK_GAME_THEMES_GAME; -ALTER TABLE GAME_VIDEO_URLS - RENAME CONSTRAINT FKJKKWO8WDS086AS7B2KSLSVKM6 TO FK_GAME_VIDEO_URLS_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_THEMES', 'FKRV351JXLIOY0A17Y5BBJJ6FW4', 'FK_GAME_THEMES_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_VIDEO_URLS', 'FKJKKWO8WDS086AS7B2KSLSVKM6', 'FK_GAME_VIDEO_URLS_GAME'); -ALTER TABLE LIBRARY_DIRECTORIES - RENAME CONSTRAINT FKFNCKIU58I9L89MLXV388DY13B TO FK_LIBRARY_DIRECTORIES_LIBRARY; -ALTER TABLE LIBRARY_DIRECTORIES - RENAME CONSTRAINT FKJDXS58Q1IRTU0IDP6DXJHWAPM TO FK_LIBRARY_DIRECTORIES_DIRECTORY_MAPPING; +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_DIRECTORIES', 'FKFNCKIU58I9L89MLXV388DY13B', + 'FK_LIBRARY_DIRECTORIES_LIBRARY'); +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_DIRECTORIES', 'FKJDXS58Q1IRTU0IDP6DXJHWAPM', + 'FK_LIBRARY_DIRECTORIES_DIRECTORY_MAPPING'); -ALTER TABLE LIBRARY_GAMES - RENAME CONSTRAINT FK6C71EEDM0I2N1JXDE9BOBWG5M TO FK_LIBRARY_GAMES_LIBRARY; -ALTER TABLE LIBRARY_GAMES - RENAME CONSTRAINT FKDKKKES3DAY0WJ1QMV42KMMFDK TO FK_LIBRARY_GAMES_GAME; +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_GAMES', 'FK6C71EEDM0I2N1JXDE9BOBWG5M', 'FK_LIBRARY_GAMES_LIBRARY'); +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_GAMES', 'FKDKKKES3DAY0WJ1QMV42KMMFDK', 'FK_LIBRARY_GAMES_GAME'); -ALTER TABLE LIBRARY_UNMATCHED_PATHS - RENAME CONSTRAINT FKSJ51WC2LBNNXY0LKLWELI6VSB TO FK_LIBRARY_UNMATCHED_PATHS_LIBRARY; +CALL RENAME_CONSTRAINT_IF_EXISTS('LIBRARY_UNMATCHED_PATHS', 'FKSJ51WC2LBNNXY0LKLWELI6VSB', + 'FK_LIBRARY_UNMATCHED_PATHS_LIBRARY'); -ALTER TABLE GAME_ORIGINAL_IDS - RENAME CONSTRAINT FK1CSD5QD7VJT7BTTA3G7HGYBUX TO FK_GAME_ORIGINAL_IDS_GAME; -ALTER TABLE GAME_ORIGINAL_IDS - RENAME CONSTRAINT FKMT0XWLPWPU9NP0Q289JBAHJRY TO FK_GAME_ORIGINAL_IDS_PLUGIN; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_ORIGINAL_IDS', 'FK1CSD5QD7VJT7BTTA3G7HGYBUX', 'FK_GAME_ORIGINAL_IDS_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_ORIGINAL_IDS', 'FKMT0XWLPWPU9NP0Q289JBAHJRY', 'FK_GAME_ORIGINAL_IDS_PLUGIN'); -ALTER TABLE USERS - RENAME CONSTRAINT FK19LFLPG5SEIS4DWRM2LVJLXFV TO FK_USERS_AVATAR_IMAGE; +CALL RENAME_CONSTRAINT_IF_EXISTS('USERS', 'FK19LFLPG5SEIS4DWRM2LVJLXFV', 'FK_USERS_AVATAR_IMAGE'); -ALTER TABLE GAME_FIELD_SOURCE - RENAME CONSTRAINT FKNJC4QSS5APFHTPWP42OAEAL5G TO FK_GAME_FIELD_SOURCE_PLUGIN; -ALTER TABLE GAME_FIELD_SOURCE - RENAME CONSTRAINT FKSR1BGTX5XJVMAL7FEFGL982TP TO FK_GAME_FIELD_SOURCE_USER; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELD_SOURCE', 'FKNJC4QSS5APFHTPWP42OAEAL5G', 'FK_GAME_FIELD_SOURCE_PLUGIN'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELD_SOURCE', 'FKSR1BGTX5XJVMAL7FEFGL982TP', 'FK_GAME_FIELD_SOURCE_USER'); -ALTER TABLE GAME_FIELD_METADATA - RENAME CONSTRAINT FKQ4RC409TP8FUBTTM733PMJD8F TO FK_GAME_FIELD_METADATA_SOURCE; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELD_METADATA', 'FKQ4RC409TP8FUBTTM733PMJD8F', 'FK_GAME_FIELD_METADATA_SOURCE'); -ALTER TABLE GAME_FIELDS - RENAME CONSTRAINT FKLNEPI7YWCI86YH21KO9WD9PYF TO FK_GAME_FIELDS_GAME; -ALTER TABLE GAME_FIELDS - RENAME CONSTRAINT FKT8FLOFDAPX5M746S5LW54C5B3 TO FK_GAME_FIELDS_METADATA; +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELDS', 'FKLNEPI7YWCI86YH21KO9WD9PYF', 'FK_GAME_FIELDS_GAME'); +CALL RENAME_CONSTRAINT_IF_EXISTS('GAME_FIELDS', 'FKT8FLOFDAPX5M746S5LW54C5B3', 'FK_GAME_FIELDS_METADATA'); -ALTER TABLE TOKEN - RENAME CONSTRAINT FKGHOIALAPTI5JFEJ506JBB1O8Y TO FK_TOKEN_CREATOR_USER; +CALL RENAME_CONSTRAINT_IF_EXISTS('TOKEN', 'FKGHOIALAPTI5JFEJ506JBB1O8Y', 'FK_TOKEN_CREATOR_USER'); -ALTER TABLE USER_ROLES - RENAME CONSTRAINT FKHFH9DX7W3UBF1CO1VDEV94G3F TO FK_USER_ROLES_USER; +CALL RENAME_CONSTRAINT_IF_EXISTS('USER_ROLES', 'FKHFH9DX7W3UBF1CO1VDEV94G3F', 'FK_USER_ROLES_USER'); -- End of migration diff --git a/app/src/main/resources/db/migration/V2.1.0.2__Create_game_requests_table.sql b/app/src/main/resources/db/migration/V2.1.0.2__Create_game_requests_table.sql index 970cb67..4b0995d 100644 --- a/app/src/main/resources/db/migration/V2.1.0.2__Create_game_requests_table.sql +++ b/app/src/main/resources/db/migration/V2.1.0.2__Create_game_requests_table.sql @@ -5,13 +5,13 @@ /****************************************************************************************** * 1. Create new sequence ******************************************************************************************/ -CREATE SEQUENCE GAME_REQUEST_SEQ +CREATE SEQUENCE IF NOT EXISTS GAME_REQUEST_SEQ INCREMENT BY 50; /****************************************************************************************** * 2. Create new tables ******************************************************************************************/ -CREATE TABLE GAME_REQUEST +CREATE TABLE IF NOT EXISTS GAME_REQUEST ( ID BIGINT NOT NULL PRIMARY KEY, TITLE VARCHAR(255) NOT NULL, @@ -20,23 +20,22 @@ CREATE TABLE GAME_REQUEST REQUESTER_ID BIGINT, LINKED_GAME_ID BIGINT, CREATED_AT TIMESTAMP NOT NULL, - UPDATED_AT TIMESTAMP NOT NULL + UPDATED_AT TIMESTAMP NOT NULL, + CONSTRAINT FK_GAMEREQUEST_ON_REQUESTER + FOREIGN KEY (REQUESTER_ID) REFERENCES USERS + ON DELETE SET NULL ); -CREATE TABLE GAME_REQUEST_VOTERS +CREATE TABLE IF NOT EXISTS GAME_REQUEST_VOTERS ( GAME_REQUEST_ID BIGINT NOT NULL, VOTERS_ID BIGINT NOT NULL, - PRIMARY KEY (GAME_REQUEST_ID, VOTERS_ID) + PRIMARY KEY (GAME_REQUEST_ID, VOTERS_ID), + CONSTRAINT FK_GAMREQVOT_ON_GAME_REQUEST + FOREIGN KEY (GAME_REQUEST_ID) REFERENCES GAME_REQUEST + ON DELETE CASCADE, + CONSTRAINT FK_GAMREQVOT_ON_USER + FOREIGN KEY (VOTERS_ID) REFERENCES USERS ); -ALTER TABLE GAME_REQUEST - ADD CONSTRAINT FK_GAMEREQUEST_ON_REQUESTER FOREIGN KEY (REQUESTER_ID) REFERENCES USERS (ID) ON DELETE SET NULL; - -ALTER TABLE GAME_REQUEST_VOTERS - ADD CONSTRAINT FK_GAMREQVOT_ON_GAME_REQUEST FOREIGN KEY (GAME_REQUEST_ID) REFERENCES GAME_REQUEST (ID) ON DELETE CASCADE; - -ALTER TABLE GAME_REQUEST_VOTERS - ADD CONSTRAINT FK_GAMREQVOT_ON_USER FOREIGN KEY (VOTERS_ID) REFERENCES USERS (ID); - -- End of migration