Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để loại bỏ tất cả các ràng buộc Khóa ngoại trong tất cả các bảng?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sửa đổi thời gian lưu giữ dữ liệu thu thập dữ liệu thay đổi (CDC) trong SQL Server - Hướng dẫn sử dụng SQL Server

  2. Sự khác biệt giữa các phép chuyển đổi Kết hợp Tham gia và Tra cứu trong SSIS là gì?

  3. Lỗi đăng nhập máy chủ SQL:Đăng nhập không thành công cho người dùng 'NT AUTHORITY \ SYSTEM'

  4. Cách liệt kê các tính năng không được dùng nữa trong phiên bản máy chủ SQL bằng T-SQL

  5. Tự động truy xuất tên tham số và giá trị hiện tại bên trong thủ tục lưu trữ T-SQL