Ya, itu selalu buruk untuk membuat perilaku bergantung pg_trigger_depth()
Mungkin saya sedikit tidak suka dengan pernyataan selimut, tetapi apa manfaatnya? Tidak ada argumen yang bisa saya lihat mengapa Anda menginginkan fitur seperti itu. Tujuan utama dari database adalah untuk memastikan integritas data. Dan sejauh yang saya bisa lihat, dan saya mungkin salah, penggunaan seperti itu selalu merupakan potensi pelanggaran integritas data. Dalam jawaban @ Erwin dia berkata "jika kamu lupa" . Inti dari memastikan integritas adalah untuk menghilangkan kemungkinan itu. Jika agen dapat mengingat semuanya dan memahami konsekuensi dan kode di sekitar mereka, Anda bisa mendapatkan integritas data dari apa pun .
Mari kita perkenalkan beberapa istilah, dalam pemrograman, yang kita miliki
- "Status" yang mencakup apa pun yang dapat diakses oleh programmer.
- "konteks eksekusi" yang mencakup lingkungan untuk dieksekusi.
Kami selanjutnya memiliki istilah untuk suatu fungsi, yang tidak memiliki keadaan yang kita sebut fungsi murni ,
Fungsi selalu mengevaluasi nilai hasil yang sama dengan nilai argumen yang sama. Nilai hasil fungsi tidak dapat bergantung pada informasi atau keadaan tersembunyi yang dapat berubah saat eksekusi program berlangsung atau antara eksekusi program yang berbeda, juga tidak dapat bergantung pada input eksternal dari perangkat I / O (biasanya — lihat di bawah).
Perbedaan untuk kemurnian berguna karena menghilangkan beban apapun mengingat apa pun atas nama komputer, atau programmer: f(x) = y
adalah selalu benar. Di sini Anda melanggar kemurnian di tempat terburuk - database. Dan, Anda melakukannya dengan cara yang kompleks dan rawan kesalahan - membuat konteks eksekusi internal menjadi hal yang gamblang dalam keadaan aplikasi DB Anda.
Saya tidak mau itu. Pertimbangkan saja kerumitan yang harus Anda lindungi secara mental.
Table A
Ini Trigger A
kebakaran
Trigger A
selalu mengeluarkan DML Table B
, firing Trigger B
.
Trigger B
bersyarat mengeluarkan DML ke Table A
, firing Trigger A
.
Trigger B
selalu mengeluarkan DML Table A
, firing Trigger A
.
Trigger A
bersyarat mengeluarkan DML ke Table B
, firing Trigger B
.
Trigger B
bersyarat mengeluarkan DML ke Table A
, firing Trigger A
.
Trigger B
selalu mengeluarkan DML Table A
, firing Trigger A
.
Jika itu terlihat rumit, perlu diingat bahwa "kondisional" di sana dapat diperluas lebih lanjut ke "itu terjadi, tetapi mungkin tidak selalu terjadi" , dan "itu tidak terjadi, tetapi itu bisa terjadi di tempat lain."
Agar pg_trigger_depth()
bermanfaat, Anda harus memiliki serangkaian acara yang sama rumitnya. Dan, sekarang, Anda ingin eksekusi bergantung pada konten eksekusi di rantai itu?
Saya akan menghindari ini. Jika sistem pemicu Anda adalah kompleks ini, Anda bermain kentang panas dengan granat tangan di lemari sendirian dan sepertinya tidak akan berakhir dengan baik.