Có rất nhiều thông tin về chủ đề xung quanh. Kiểm tra câu trả lời chi tiết này bởi @AaronBertrand. Nó nói về việc vô hiệu hóa tạm thời các phím ngoại nhưng đọc hết nó và sửa đổi theo ý muốn, bạn sẽ có một tập lệnh hay để chơi và đạt được nhiều thành tích.
Từ phía tôi, tôi có thể đề xuất 2 script khác nhau để lấy tất cả các khóa ngoại. Trong cả hai trường hợp, bỏ ghi chú --EXEC (@SQL)
để thực thi ALTER
của bạn mã số. Hoặc bạn có thể đợi cho đến khi nó in tất cả các mệnh đề thay thế và sau đó sao chép dán để thực thi chúng.
Cái đầu tiên sử dụng INFORMATION_SCHEMA
để có được các ràng buộc:
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
Cái này sử dụng các chế độ xem hệ thống khác nhau và một bảng 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