Saya sedang melihat database sampel AdventureWorks untuk SQL Server 2008, dan saya melihat dalam skrip penciptaan mereka bahwa mereka cenderung menggunakan yang berikut:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
segera diikuti oleh:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Saya melihat ini untuk kunci asing (seperti di sini), batasan unik dan CHECK
batasan reguler ; DEFAULT
kendala menggunakan format biasa saya lebih akrab dengan seperti:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
Apa bedanya, jika ada, antara melakukannya dengan cara pertama versus yang kedua?
sumber
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
dan mengaktifkannya kembali denganALTER TABLE foo CHECK CONSTRAINT fk_b
itu tidak memverifikasi kendala.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
diperlukan untuk memiliki data diverifikasi.Untuk menunjukkan bagaimana ini bekerja -
sumber
DROP TABLE T2; DROP TABLE T1;
Lebih lanjut ke komentar yang sangat baik di atas tentang kendala tepercaya:
Kendala yang tidak dipercaya, seperti namanya, tidak bisa dipercaya untuk secara akurat mewakili kondisi data dalam tabel saat ini. Namun, hal itu dapat dipercaya untuk memeriksa data yang ditambahkan dan dimodifikasi di masa mendatang.
Selain itu, kendala yang tidak dipercaya diabaikan oleh pengoptimal kueri.
Kode untuk mengaktifkan batasan pemeriksaan dan batasan kunci asing cukup buruk, dengan tiga arti kata "centang".
sumber
WITH NOCHECK
digunakan juga ketika seseorang memiliki data yang ada dalam tabel yang tidak sesuai dengan batasan seperti yang ditentukan dan Anda tidak ingin itu bertabrakan dengan kendala baru yang Anda laksanakan ...sumber
WITH CHECK
memang perilaku default namun praktik yang baik untuk dimasukkan dalam pengkodean Anda.Perilaku alternatif tentu saja digunakan
WITH NOCHECK
, jadi ada baiknya untuk secara eksplisit mendefinisikan niat Anda. Ini sering digunakan ketika Anda bermain dengan / memodifikasi / mengganti partisi inline.sumber
Batasan kunci asing dan pemeriksaan memiliki konsep dipercaya atau tidak dipercaya, serta diaktifkan dan dinonaktifkan. Lihat halaman MSDN untuk
ALTER TABLE
untuk detail lengkap.WITH CHECK
adalah standar untuk menambahkan kunci asing baru dan memeriksa batasan,WITH NOCHECK
adalah default untuk mengaktifkan kembali kunci asing yang dinonaktifkan dan memeriksa kendala. Sangat penting untuk menyadari perbedaannya.Karena itu, setiap pernyataan yang tampaknya berlebihan yang dihasilkan oleh utilitas hanya ada untuk keamanan dan / atau kemudahan pengkodean. Jangan khawatir tentang mereka.
sumber
WITH CHECK CHECK CONSTRAINT
untuk membuatnya dipercaya.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
menemukan batasan yang dinonaktifkan dan tidak tepercaya. Setelah mengeluarkan pernyataan tabel perubahan yang sesuai seperti di atas, kendala-kendala itu hilang dari kueri, jadi saya bisa melihatnya berfungsi.Berikut adalah beberapa kode yang saya tulis untuk membantu kami mengidentifikasi dan memperbaiki CONSTRAINT yang tidak terpercaya dalam DATABASE. Ini menghasilkan kode untuk memperbaiki setiap masalah.
sumber