Beberapa masalah tanpa urutan tertentu.
Pertama, di isi pemicu tingkat baris, Anda perlu menggunakan :new
dan :old
untuk referensi catatan baru dan lama. Usus besar terkemuka diperlukan. Jadi WHERE
. Anda klausa harus
WHERE PROJECTID = :new.PROJECTID
Kedua, jika Anda menjalankan CREATE TRIGGER
di SQL*Plus, Anda bisa mendapatkan daftar kesalahan dan peringatan menggunakan SHOW ERRORS
perintah, yaitu
SQL> show errors
Anda juga dapat menanyakan DBA_ERRORS
tabel (atau ALL_ERRORS
atau USER_ERRORS
tergantung pada tingkat hak istimewa Anda) tetapi itu bukan sesuatu yang biasanya Anda perlukan.
Ketiga, dengan asumsi kesalahan sintaks diperbaiki, Anda akan mendapatkan bermutasi kesalahan tabel
jika Anda menggunakan logika ini. Pemicu tingkat baris pada tabel A (TPM_TRAININGPLAN
dalam kasus ini) tidak dapat mengkueri tabel A karena tabel mungkin dalam keadaan tidak konsisten. Anda dapat mengatasinya, seperti yang ditunjukkan Tim dalam artikelnya, dengan membuat paket dengan koleksi, menginisialisasi koleksi itu di pemicu pernyataan sebelumnya, mengisi data dalam koleksi di pemicu tingkat baris, lalu memproses baris yang dimodifikasi di pemicu pernyataan setelah. Namun, itu adalah jumlah kerumitan yang layak untuk ditambahkan ke sistem, karena Anda harus mengelola beberapa objek berbeda.
Secara umum, Anda sebaiknya menerapkan logika ini sebagai bagian dari API apa pun yang Anda gunakan untuk memanipulasi TPM_TRAININGPLAN
meja. Jika itu adalah prosedur tersimpan, lebih masuk akal untuk menempatkan logika untuk memperbarui TPM_PROJECT
dalam prosedur tersimpan itu daripada memasukkannya ke dalam pemicu. Sangat menyakitkan untuk mencoba men-debug aplikasi yang memiliki banyak logika yang tertanam di pemicu karena hal itu membuat sangat sulit bagi pengembang untuk mengikuti dengan tepat operasi apa yang sedang dilakukan. Sebagai alternatif, Anda dapat menghapus TRAININGDELIVERYSTART
kolom dari TPM_PROJECT
tabel dan cukup hitung tanggal mulai minimum saat runtime.
Keempat, jika pemicu Anda diaktifkan pada penyisipan, pembaruan, dan penghapusan, Anda tidak bisa hanya mereferensikan :new
nilai-nilai. :new
valid untuk sisipan dan pembaruan tetapi akan menjadi NULL jika Anda melakukan penghapusan. :old
valid untuk penghapusan dan pembaruan tetapi akan menjadi NULL jika Anda melakukan penyisipan. Itu berarti Anda mungkin perlu memiliki logika di sepanjang baris (merujuk solusi paket Tim)
BEGIN
IF inserting
THEN
trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'INSERT');
ELSIF updating
THEN
trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'UPDATE');
ELSIF deleting
THEN
trigger_api.tab1_row_change(p_id => :old.projectid, p_action => 'DELETE');
END IF;
END;