Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle - Masalah membuat pemicu yang memperbarui tabel lain

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Boot - Hubungkan kembali ke database setelah restart

  2. Mendapatkan jejak tumpukan kesalahan MySQL pada Koneksi Oracle JDBC

  3. Menyimpan gambar yang diunggah:Haruskah disimpan di server atau di database?

  4. Oracle:SEPERTI di mana setiap bagian dari satu string cocok dengan bagian mana pun dari string lain

  5. Buat dan Konfigurasikan Oracle Linked Server di SQL Server