Ada banyak informasi tentang subjek di sekitar. Lihat jawaban mendetail ini oleh @AaronBertrand. Ini berbicara tentang menonaktifkan sementara kunci asing tetapi membaca semuanya dan memodifikasi sesuka hati Anda akan memiliki skrip yang bagus untuk dimainkan dan mencapai banyak hal.
Dari pihak saya, saya dapat mengusulkan 2 skrip berbeda untuk mendapatkan semua kunci asing. Pada kedua kasus, batalkan komentar --EXEC (@SQL)
untuk menjalankan ALTER
. Anda kode. Atau Anda dapat menunggu hingga ia mencetak semua klausa perubahan, lalu salin tempel untuk menjalankannya.
Yang pertama menggunakan INFORMATION_SCHEMA
untuk mendapatkan batasan:
DECLARE @SQL VARCHAR(MAX)=''
SELECT @SQL = @SQL + 'ALTER TABLE ' + QUOTENAME(FK.TABLE_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME) + ' DROP CONSTRAINT [' + RTRIM(C.CONSTRAINT_NAME) +'];' + CHAR(13)
--SELECT K_Table = FK.TABLE_NAME, FK_Column = CU.COLUMN_NAME, PK_Table = PK.TABLE_NAME, PK_Column = PT.COLUMN_NAME, Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
--EXEC (@SQL)
PRINT @SQL
Yang ini menggunakan tampilan sistem yang berbeda dan tabel CTE.
DECLARE @SQL varchar(4000)=''
;WITH ReferencingFK AS
(
SELECT fk.Name AS 'FKName', OBJECT_NAME(fk.parent_object_id) 'ParentTable',
cpa.name 'ParentColumnName', OBJECT_NAME(fk.referenced_object_id) 'ReferencedTable',
cref.name 'ReferencedColumnName'
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.columns cpa ON fkc.parent_object_id = cpa.object_id AND fkc.parent_column_id = cpa.column_id
INNER JOIN sys.columns cref ON fkc.referenced_object_id = cref.object_id AND fkc.referenced_column_id = cref.column_id
)
SELECT @SQL = @SQL + 'ALTER TABLE ' + ParentTable + ' DROP CONSTRAINT [' + RTRIM(FKName) +'];' + CHAR(13)
--SELECT FKName, ParentTable, ParentColumnName, ReferencedTable, ReferencedColumnName
FROM ReferencingFK
WHERE ReferencedTable = 'Employee'
ORDER BY ParentTable, ReferencedTable, FKName
--EXEC (@SQL)
PRINT @SQL