Kunci asing menjadi tidak dipercaya setelah dimasukkan dalam jumlah besar

10

Dalam server edisi SQL 2014 (12.0.2430.0 - belum ada SP1) dengan database dalam mode kompatibilitas 2012 (bekerja untuk membuatnya beralih ke 2014 ...) Saya memiliki beberapa objek kunci asing yang secara konsisten ditandai seperti not trusteddalam database . Saya telah menjatuhkan dan membuat ulang mereka tanpa NOCHECKopsi, tetapi dalam 5-10 menit mereka menjadi tidak dapat dipercaya lagi dan jika saya menghasilkan CREATEskrip, hasilnya adalah:

ALTER TABLE [dbo].[Points]  WITH NOCHECK 
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

Script buat yang digunakan adalah:

ALTER TABLE [dbo].[Points]
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId]
GO

Tidak ada replikasi, tidak ada alat pihak ketiga, dan saya memonitor semua pernyataan DDL pada database sehingga bukan pengguna lain.

Saya dapat memeriksa kendala dengan baik (menggunakan WITH CHECK CHECKmasing-masing) tetapi mereka masih menjadi tidak dipercaya segera setelah itu. Hanya pekerjaan pemeliharaan yang dijalankan adalah Ola pada awal pagi dan ini terjadi sepanjang hari.

Memperbarui:

Jadi, setelah beberapa jejak untuk mempersempit kemungkinan, sepertinya a BULK INSERTdapat menyebabkan FKmenjadi tidak dipercaya. Pertanyaan msdn ini menyatakan bahwa ini adalah rute yang valid untuk kunci menjadi tidak dipercaya, yang merupakan yang pertama kali saya dengar.

Jadi pertanyaan saya sekarang adalah, adakah strategi alternatif untuk menggunakan BULK INSERTyang dapat mempertahankan is_trustedstatus kunci asing ? Itu dieksekusi dalam konteks aplikasi yang berjalan beberapa kali per jam. Saya bisa meminta para pengembang untuk memasukkan pernyataan penyisipan mereka sebagai gantinya, tetapi saya lebih memilih untuk tidak menggunakan ultimatum untuk digunakan BULK INSERTjika saya tidak harus melakukannya.

LowlyDBA
sumber

Jawaban:

9

A BULK INSERTdari aplikasi kami adalah penyebab kunci asing yang tidak dipercaya, sebagaimana dikonfirmasi oleh pertanyaan MSDN . Mirip dengan BCP, kapan saja BULK INSERTdilakukan maka kunci asing tidak diperiksa saat memasukkan, karenanya membuatnya tidak dipercaya.

Seperti yang disebutkan Kin, ada skrip sederhana yang tersedia untuk menemukan dan memperbaiki kunci asing yang tidak dipercaya, tetapi dalam skenario saya, penyisipan terjadi pada frekuensi yang membuat upaya untuk terus memperbaiki masalah ini tidak sepadan.

Dan ypercube menyarankan menggunakan CHECK_CONSTRAINTS opsi dalam sisipan massal yang akan memaksa kendala untuk dipatuhi.

Saya berencana untuk meninjau dengan pengembang untuk memastikan bahwa setiap penggunaan BULK INSERTdibenarkan dalam hal baris yang dimasukkan, jika tidak maka harus ada sesuatu untuk dijalani.

LowlyDBA
sumber
2
Saya menggunakan SqlBulkCopydengan efek yang sama, tetapi ada (setidaknya sekarang) pilihan untuk melakukan salinan massal sambil masih memeriksa kendala - yang berarti bahwa fasilitas salinan massal dapat melakukan pengecekan pada prinsipnya, kemungkinan besar bcp memiliki beberapa opsi untuk mengaktifkan bahwa. Siapa pun yang membuat mode non-pengecekan, standarnya harus dipukul di bagian muka.
John