Tillfälligt radera främmande nycklar
![article feature image](/posts/2020/drop-foreign-keys/feature.png)
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;