Tôi đang sử dụng tập lệnh T-SQL này ở đây để phát hiện các ràng buộc FK có thể trùng lặp - và nó cũng tạo ra các câu lệnh ALTER TABLE...DROP CONSTRAINT
cần thiết ở cột cuối cùng của các cột đầu ra.
Bạn không thể tự động phát hiện và chọn nhiều hạn chế FK để thả - vì vậy bạn về cơ bản còn lại để phát hiện chúng và sau đó chọn thủ công để thả xuống (sử dụng câu lệnh thả do truy vấn của tôi tạo).
;WITH FKData AS
(
SELECT
fk.parent_object_id,
fkc.parent_column_id,
fk.referenced_object_id,
fkc.referenced_column_id,
FKCount = COUNT(*)
FROM
sys.foreign_keys fk
INNER JOIN
sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
GROUP BY
fk.parent_object_id, fkc.parent_column_id, fk.referenced_object_id, fkc.referenced_column_id
HAVING
COUNT(*) > 1
),
DuplicateFK AS
(
SELECT
FKName = fk.Name,
ParentSchema = s1.Name,
ParentTable = t1.Name,
ParentColumn = c1.Name,
ReferencedTable = t2.Name,
ReferencedColumn = c2.Name
FROM
sys.foreign_keys fk
INNER JOIN
sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN
FKData f ON fk.parent_object_id = f.parent_object_id
AND fk.referenced_object_id = f.referenced_object_id
AND fkc.parent_column_id = f.parent_column_id
AND fkc.referenced_column_id = f.referenced_column_id
INNER JOIN
sys.tables t1 ON f.parent_object_id = t1.object_id
INNER JOIN
sys.columns c1 ON f.parent_object_id = c1.object_id AND f.parent_column_id = c1.column_id
INNER JOIN
sys.schemas s1 ON t1.schema_id = s1.schema_id
INNER JOIN
sys.tables t2 ON f.referenced_object_id = t2.object_id
INNER JOIN
sys.columns c2 ON f.referenced_object_id = c2.object_id AND f.referenced_column_id = c2.column_id
)
SELECT
FKName,
ParentSchema, ParentTable, ParentColumn,
ReferencedTable, ReferencedColumn,
DropStmt = 'ALTER TABLE ' + ParentSchema + '.' + ParentTable +
' DROP CONSTRAINT ' + FKName
FROM
DuplicateFK
Nguồn
2012-03-23 21:51:10
Tuyệt vời cảm ơn !! – peter
có cách nào để chúng tôi có thể lấy tên lược đồ không? vì có rất ít không thuộc về lược đồ dbo. – peter
@Peter: ** SURE! ** đã cập nhật phản hồi của tôi để bao gồm lược đồ gốc (bạn cũng có thể nhận giản đồ tham chiếu nếu cần - nhưng bạn không cần nó cho câu lệnh DROP) –