Kim Torgersen


Tillfälligt radera främmande nycklar

article feature image


Ibland behöver du tillfälligt bli av med nycklar mot en tabell. Du vill skapa om den, ändra primärnyckel, eller något annat som främmande nyckar hindrar dig ifrån att göra.

Det här skriptet genererar DROP- och CREATE-script för alla främmande nycklar mot angiven tabell, som du sedan kan exekvera bäst du vill.

DECLARE
    @tableid int = OBJECT_ID('dbo.table'),
    @sql1 VARCHAR(max) = '',
    @sql2 VARCHAR(max) = '';

SELECT
    @sql1 = CONCAT(@sql1,
        '-- ', FK.name, CHAR(13), CHAR(10),
        'ALTER TABLE ', S1.name, '.', T1.name, ' DROP CONSTRAINT ', FK.name, ';',
        CHAR(13), CHAR(10)),
    @sql2 = CONCAT(@sql2,
        '-- ', FK.name, CHAR(13), CHAR(10),
        'ALTER TABLE ', S1.name, '.', T1.name, ' ADD CONSTRAINT ', FK.name,
        ' FOREIGN KEY (', FKC.Columns, ') REFERENCES ', S2.name, '.', T2.name, ';',
        CHAR(13), CHAR(10))
FROM
    sys.foreign_keys FK
    OUTER APPLY (
        SELECT
            STUFF(
                ((
                    SELECT ', ', C.name
                    FROM
                        sys.foreign_key_columns FKC
                        JOIN sys.columns C ON
                            C.object_id = FKC.parent_object_id AND
                            C.column_id = FKC.parent_column_id
                    WHERE
                        FKC.constraint_object_id = FK.object_id
                    ORDER BY
                        C.column_id
                    FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                ),
                1,
                2,
                ''
            ) AS [Columns]
    ) FKC
    JOIN sys.tables T1 ON
        T1.object_id = FK.parent_object_id
    JOIN sys.tables T2 ON
        T2.object_id = FK.referenced_object_id
    JOIN sys.schemas S1 ON
        S1.schema_id = T1.schema_id
    JOIN sys.schemas S2 ON
        S2.schema_id = T2.schema_id
WHERE
    FK.referenced_object_id = @tableid
ORDER BY
    FK.name;

PRINT @sql1;
PRINT REPLICATE(CHAR(13) + CHAR(10), 3)
PRINT @sql2;