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;