Mengaktifkan dan menonaktifkan batasan kunci asing

Kami memiliki proses ETL panjang yang mengalirkan data dari file input melalui serangkaian tabel.

Saya mempertimbangkan kemungkinan yang tidak mungkin untuk menambahkan integritas relasional ke tabel kami, tetapi saya tidak ingin proses ETL kami mati ketika menemui pelanggaran. Saya juga ingin catatan yang melanggar integritas referensial tetap dimuat. Namun, pada akhirnya, saya ingin mewaspadai semua pelanggaran integritas referensial.

Metode 1: Saya dapat mengabaikan integritas referensial dan menulis prosedur SQL yang menjalankan sekumpulan prosedur tersimpan untuk mengidentifikasi catatan yang melanggar integritas relasional, tetapi saya sangat menyukai gagasan integritas relasi yang ada di tabel itu sendiri karena saya merasa bahwa dokumen ini database di tempat terbaik - db.

Metode 2: Daripada menulis serangkaian kueri khusus untuk mengidentifikasi pelanggar, menurut saya kita harus membuang semua integritas referensi di awal proses dan kemudian menambahkannya di akhir. Jika kami mendapat pengecualian, kami tahu ada pelanggaran. Saya menyukai pendekatan ini, tetapi tidak seperti Metode 1 di mana SQL dapat ditulis untuk menargetkan hanya catatan yang baru saja ditambahkan untuk calon pelanggar, menambahkan kembali integritas ref mungkin akan memeriksa ulang seluruh tabel -- tabel yang terus berkembang. Ketika integritas referensi diaktifkan kembali, konsumen data dapat yakin bahwa data tersebut "baik" tanpa melakukan kueri apa pun lagi dengan cepat. Aku suka itu...

Apakah ada pendekatan ketiga? Saya melihat T-SQL mendukung perintah seperti

NOCHECK CONSTRAINT  
ON UPDATE  NO ACTION  
ON INSERT  NO ACTION

tapi saya tidak yakin bagaimana tujuan penggunaannya. Misalnya,

ALTER TABLE dbo.TableName NOCHECK CONSTRAINT FK01

Apakah maksudnya ini untuk mematikan pemeriksaan constrationmt ketika Anda memiliki sumber yang dapat dipercaya? Saya berasumsi bahwa jika dimatikan dan dihidupkan dengan cara ini maka pengaturan chg hanya berlaku untuk operasi di masa depan.

Pendekatan terbaik apa yang akan Anda gunakan agar proses selesai sampai akhir dan tetap mengidentifikasi semua integritas relasional atau kemungkinan pelanggaran integritas relasional?


person Chad    schedule 02.11.2011    source sumber
comment
Kami memiliki situasi serupa, tugas-tugas yang diandalkan pelanggan sehari-hari yang mungkin mengakibatkan data tidak valid tetapi tidak memengaruhi bisnis mereka. Saya memilih opsi 1 Anda karena kami dapat menjalankan prosedur validasi khusus di tempat dan melihat data apa yang sudah tidak valid sehingga kami tahu apa yang perlu kami perbaiki (data dan program) sebelum kami dapat mengaktifkan batasan integritas yang ingin kami tambahkan.   -  person WileCau    schedule 01.05.2013


Jawaban (2)


1.Saya menemukan nama NO ACTION agak menyesatkan karena berarti DML akan gagal jika melanggar batasan. Beberapa RDMS, khususnya mysql, memiliki kata kunci yang lebih baik - RESTRICT yang lebih deskriptif.
2. Anda dapat menonaktifkan/mengaktifkan semua batasan untuk sementara dengan ALTER TABLE ... NOCHECK/CHECK CONSTRAINT ALL

person a1ex07    schedule 02.11.2011

Saya pribadi tidak akan pernah mematikan kendala FK. Ini adalah awal dari kemunduran yang licin menuju neraka. Mereka ada di sana karena suatu alasan.

Saya akan membagi ETL Anda menjadi beberapa kumpulan N baris dan membungkus masing-masing dalam sebuah transaksi. Jika transaksi gagal karena pelanggaran FK, catatlah dan lakukan apa pun persyaratan pemulihan Anda. Jangan pernah meninggalkan data buruk.

person Deleted    schedule 02.11.2011