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 |
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