Skenario:
Anda perlu memotong semua tabel dalam database SQL Server, ketika Anda menjalankan pernyataan terpotong, Anda mendapatkan kesalahan di bawah ini.Msg 4712, Level 16, Status 1, Baris 43
Tidak dapat memotong tabel 'SchemaName. TableName' karena direferensikan oleh batasan FOREIGN KEY.
Cara mudahnya adalah dengan menghapus Batasan Kunci Asing, memotong tabel, dan membuat kembali Batasan Kunci Asing.
Saya menulis posting yang dapat Anda gunakan untuk menghasilkan Drop Foreign Key Constraints dalam database. Klik disini.
Tetapi sebelum kita menghapusnya, kita perlu membuat skrip Buat Batasan Kunci Asing agar kita dapat menjalankannya setelah memotong tabel.
Anda dapat menggunakan skrip di bawah ini untuk membuat pernyataan tabel terpotong untuk semua tabel pengguna dari database.
Select 'Truncate table '+'[' +Schema_name(Schema_id) +'].['+name+']' as TruncateTablesScript from sys.tables where is_ms_shipped=0
Script di bawah ini dapat digunakan untuk membuat ulang Batasan Kunci Asing dalam database.
;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 ![]() |
| Cara membuat skrip untuk membuat kembali Batasan Kunci Asing di Database SQL Server |
Ambil hasil dari Kolom CreateForeignKeyConstraintScript. Saya menyarankan Anda untuk menjalankan skrip di DEV atau QA terlebih dahulu untuk memastikan semua berfungsi dengan baik sebelum Anda menjalankan di Produksi.
Video Demo :Cara membuat generate skrip untuk membuat ulang Batasan Kunci asing di SQL Server
