Saya umumnya waspada terhadap penghapusan bertingkat (dan tindakan otomatis lainnya yang dapat menjatuhkan / merusak data), baik melalui pemicu atau ON <something> CASCADE
. Fasilitas seperti itu sangat kuat, tetapi juga berpotensi berbahaya.
- Jadi, apakah cascading menghapus pilihan yang benar di sini?
Itu pasti akan melakukan apa yang Anda cari untuk dilakukan: menghapus catatan terkait ketika catatan orang tua dihapus, tanpa Anda perlu menerapkan logika lain untuk memastikan bahwa anak-anak dihapus terlebih dahulu sehingga membuat kode Anda lebih ringkas. Semua tindakan akan dibungkus dalam transaksi implisit sehingga jika sesuatu menghalangi anak menghapus seluruh operasi diblokir, menjaga integritas referensial dengan sedikit atau tanpa upaya pengkodean tambahan.
Pastikan bahwa Anda menggunakan penghapusan bertingkat dan tindakan "di balik layar" lainnya didokumentasikan dengan baik sehingga pengelola sistem di masa mendatang sepenuhnya menyadarinya.
- Kapan cascading detele tidak boleh digunakan?
Seharusnya tidak digunakan jika Anda paranoid seperti saya! Satu poin kunci untuk dipertimbangkan adalah pengembang lain yang saat ini, atau mungkin di masa depan, mengerjakan kode / basis data Anda (karenanya komentar di atas tentang mendokumentasikan perilaku "tersembunyi").
Sangat umum dalam pengalaman saya untuk orang yang tidak berpengalaman untuk menggunakan DELETE
kemudian kembali INSERT
untuk memperbarui baris, terutama ketika apa yang mereka inginkan adalah MERGE
/ UPSERT
operasi (perbarui baris yang ada dan buat yang baru di mana baris dengan kunci yang diberikan tidak ada) dan DBMS tidak mendukung penggabungan / peningkatan (atau mereka tidak mengetahui dukungannya). Tanpa tindakan bertingkat ini sangat aman (atau akan kesalahan ketika mengancam integritas data) tetapi jika seseorang melakukan ini untuk baris dalam tabel induk di mana merujuk FK memilikiON DELETE CASCADE
atur maka data terkait akan dihapus sebagai akibat dari penghapusan awal dan tidak diganti - sehingga data hilang (bahkan jika penghapusan dan penyisipan berikutnya dibungkus dalam transaksi eksplisit, kaskade terjadi dengan operasi penghapusan - itu tidak akan menunggu untuk melihat apakah transaksi menggantikan baris dalam tabel induk dalam pernyataan berikutnya) dan kaskade dapat dilanjutkan melalui kapal relasi lainnya (misalnya: hapus supervisor senior, timnya dihapus oleh kaskade, tim timnya dihapus oleh kaskade, semua catatan terlacak untuk semua orang itu dihapus oleh kaskade, ...). Tanpa cascading diaktifkan, Anda hanya akan mendapatkan kesalahan di sini alih-alih data hilang secara diam-diam.