ALTER TABLE CHECK CONSTRAINT

25

Dari Object Explorer di SQL Server, ketika memilih dan membuat skrip batasan kunci asing, kode berikut dihasilkan.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Apa tujuan dari pernyataan terakhir "ALTER TABLE CHECK CONSTRAINT"? Tampaknya tidak masalah apakah dijalankan atau tidak. Itu tidak gagal pada data buruk yang ada, juga tidak mengubah bahwa kendala akan ditegakkan pada data baru.

Terima kasih!

Delux
sumber

Jawaban:

23

Ini memastikan bahwa kendala diaktifkan setelah dibuat. ALTER TABLEPernyataan Anda termasuk WITH NOCHECKbagian mana yang mengatakan tidak memeriksa data buruk yang ada selama pembuatan kendala.

Seperti yang tertulis, data yang ada tidak akan diperiksa terhadap kendala karena WITH NOCHECKdalam pernyataan pertama. Mengeluarkan pernyataan kedua akan memungkinkan pemeriksaan terhadap kendala untuk setiap perubahan di masa depan pada tabel yang dicakup oleh kendala, sampai pada titik di mana ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]dikeluarkan.

Pernyataan, seperti yang ditulis, pada dasarnya mengatakan "Buat batasan kunci asing ini tetapi jangan periksa terhadap data yang ada. Jadikan itu aktif untuk setiap perubahan yang akan datang ke data."

squillman
sumber
Sebenarnya saya memeriksa, tidak ada bedanya jika ada data yang buruk, baris pertama atau kedua tidak akan gagal. Untuk membuat satu gagal, mereka harus terlihat seperti ini:
Delux
2
ALTER TABLE [dbo]. [T2] DENGAN CHECK CHECK CONSTRAINT [FK_T2_T1]
Delux
Kanan. Tetapi Anda akan melihatnya gagal setelah itu ketika pada titik tertentu Anda mencoba menjalankan INSERT atau UPDATE yang melanggar kendala. Tidak akan gagal jika data buruk ada pada saat 2 pernyataan dieksekusi.
squillman
7

Pernyataan pertama Anda membuat batasan yang dinonaktifkan. Itu harus diaktifkan dan mungkin dipercaya. Sintaks aneh berikut akan memastikan kendala Anda diaktifkan dan dipercaya:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Ada posting blog yang sangat bagus dari Hugo Kornelis yang menjelaskannya dengan sangat baik: Dapatkah Anda memercayai kendala Anda

AK
sumber