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

Cách tạo tập lệnh để tạo lại các ràng buộc khóa ngoại trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 73

Tình huống:

Bạn cần phải cắt bớt tất cả các bảng trong cơ sở dữ liệu SQL Server, khi bạn chạy câu lệnh cắt ngắn, bạn gặp lỗi dưới đây.
Msg 4712, Level 16, State 1, Line 43
Cannot cắt bớt bảng 'SchemaName. TableName 'vì nó đang được tham chiếu bởi ràng buộc NGOẠI KHÓA.

Cách dễ dàng là bỏ Ràng buộc khóa ngoại, cắt bớt các bảng và tạo lại Ràng buộc khóa ngoại một lần nữa.

> Tôi đã viết một bài đăng mà bạn có thể sử dụng để tạo Ràng buộc khóa ngoại trong cơ sở dữ liệu. Bấm vào đây.
Nhưng trước khi loại bỏ chúng, chúng ta cần tạo các tập lệnh tạo Ràng buộc khóa ngoại để có thể chạy sau khi cắt bớt bảng.

Bạn có thể sử dụng tập lệnh dưới đây để tạo câu lệnh bảng cắt ngắn cho tất cả bảng người dùng từ cơ sở dữ liệu.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Tập lệnh dưới đây có thể được sử dụng để tạo lại Ràng buộc khóa ngoại trong cơ sở dữ liệu.

;With CTE_FK AS (
SELECT Schema_Name(Schema_id) as TableSchemaName,
  object_name(FK.parent_object_id) ParentTableName,
  object_name(FK.referenced_object_id) ReferenceTableName,
  FK.name AS ForeignKeyConstraintName,c.name as RefColumnName,
  cf.name as ParentColumnList
       FROM sys.foreign_keys AS FK
       INNER JOIN sys.foreign_key_columns AS FKC
               ON FK.OBJECT_ID = FKC.constraint_object_id
               INNER JOIN sys.columns c
          on  c.OBJECT_ID = FKC.referenced_object_id
                 AND c.column_id = FKC.referenced_column_id
                 INNER JOIN sys.columns cf
          on  cf.OBJECT_ID = FKC.parent_object_id
                 AND cf.column_id = FKC.parent_column_id
                 where fk.is_ms_shipped=0
                 )
                 Select 
                 'Alter table ['+TableSchemaName+'].['+ParentTableName+']' 
                 +' Add Constraint '+ForeignKeyConstraintName+ 
                 ' Foreign Key('+stuff((
                 Select ','+ParentColumnList
                 from CTE_FK i
                 where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                 and i.TableSchemaName=o.TableSchemaName
                 and i.ParentTableName=o.ParentTableName
                 and i.ReferenceTableName=o.ReferenceTableName
                 for xml path('')), 1, 1, '')+') References '+
                 '['+TableSchemaName+'].['+ReferenceTableName+']('+stuff((
                 Select ','+RefColumnName
                 from CTE_FK i
                 where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                 and i.TableSchemaName=o.TableSchemaName
                 and i.ParentTableName=o.ParentTableName
                 and i.ReferenceTableName=o.ReferenceTableName
                 for xml path('')), 1, 1, '')+')'
                 AS CreateForeignKeyConstraintScript,
                 ParentTableName,
                 ReferenceTableName,
                 ForeignKeyConstraintName
                 from CTE_FK o
                 group by 
                 tableSchemaName,
                 ParentTableName,
                 ReferenceTableName,
                 ForeignKeyConstraintName
 
 
 
Cách tạo tập lệnh để tạo lại Ràng buộc khóa ngoại trong Cơ sở dữ liệu SQL Server
 Lấy kết quả từ Cột CreateForeignKeyConstraintScript. Tôi khuyên bạn nên chạy các tập lệnh trong DEV hoặc QA trước để đảm bảo rằng tất cả đều hoạt động tốt trước khi bạn chạy trong Sản xuất. 



Video Demo:Cách tạo tập lệnh để tạo lại các Ràng buộc khóa ngoại trong SQL Server

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng INSERT INTO từ SQL Server để thay đổi dữ liệu Salesforce

  2. Cách CHỌN * nhưng không có Tên cột phải là duy nhất trong mỗi dạng xem

  3. Định cấu hình Lucene.Net với SQL Server

  4. Chỉ mục nằm ngoài giới hạn của Mảng. (Microsoft.SqlServer.smo)

  5. Làm thế nào để xác định số ngày trong một tháng trong SQL Server?