Files
dashback/scripts/migrate-parent-rename.mssql.sql
2026-10-04 21:22:00 +02:00

58 lines
3.0 KiB
SQL

-- Rename article "father" columns to "parent" (SQL Server / MSSQL).
--
-- One-off manual migration (no migration code is kept in the repo).
-- sqlcmd -S <server> -d <db> -E -i scripts/migrate-parent-rename.mssql.sql
--
-- Wrapped in a transaction and guarded so it is safe to re-run.
-- Drop the existing index explicitly: SQL Server will not let a filtered
-- unique index be carried over to a renamed column.
SET XACT_ABORT ON;
BEGIN TRANSACTION;
-- Drop the old filtered unique index (references fathersort).
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'UQ_article_fatherarticle_fathersort')
DROP INDEX UQ_article_fatherarticle_fathersort ON article;
-- Drop the default constraints bound to the old column names.
IF EXISTS (SELECT 1 FROM sys.default_constraints WHERE name = 'DF_article_is_father')
ALTER TABLE article DROP CONSTRAINT DF_article_is_father;
IF EXISTS (SELECT 1 FROM sys.default_constraints WHERE name = 'DF_article_fathersort')
ALTER TABLE article DROP CONSTRAINT DF_article_fathersort;
-- Drop foreign keys bound to the old columns.
IF EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_article_fatherarticle')
ALTER TABLE article DROP CONSTRAINT FK_article_fatherarticle;
IF EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_article_fatherattributename')
ALTER TABLE article DROP CONSTRAINT FK_article_fatherattributename;
-- Rename the columns (sp_rename keeps indexes/FKs tracking the column).
IF COL_LENGTH('article', 'fatherarticle_id') IS NOT NULL
AND COL_LENGTH('article', 'parentarticle_id') IS NULL
EXEC sp_rename 'article.fatherarticle_id', 'parentarticle_id', 'COLUMN';
IF COL_LENGTH('article', 'fatherattributename_id') IS NOT NULL
AND COL_LENGTH('article', 'parentattributename_id') IS NULL
EXEC sp_rename 'article.fatherattributename_id', 'parentattributename_id', 'COLUMN';
IF COL_LENGTH('article', 'fathersort') IS NOT NULL
AND COL_LENGTH('article', 'parentsort') IS NULL
EXEC sp_rename 'article.fathersort', 'parentsort', 'COLUMN';
IF COL_LENGTH('article', 'is_father') IS NOT NULL
AND COL_LENGTH('article', 'is_parent') IS NULL
EXEC sp_rename 'article.is_father', 'is_parent', 'COLUMN';
-- Recreate the constraints under their new names.
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_article_parentarticle')
ALTER TABLE article ADD CONSTRAINT FK_article_parentarticle
FOREIGN KEY (parentarticle_id) REFERENCES article(id) ON DELETE NO ACTION;
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_article_parentattributename')
ALTER TABLE article ADD CONSTRAINT FK_article_parentattributename
FOREIGN KEY (parentattributename_id) REFERENCES attributename(id) ON DELETE NO ACTION;
ALTER TABLE article ADD CONSTRAINT DF_article_is_parent DEFAULT (0) FOR is_parent;
ALTER TABLE article ADD CONSTRAINT DF_article_parentsort DEFAULT (0) FOR parentsort;
CREATE UNIQUE INDEX UQ_article_parentarticle_parentsort
ON article (parentarticle_id, parentsort)
WHERE parentarticle_id IS NOT NULL;
COMMIT TRANSACTION;