Saya mencoba membuat trigger sederhana di database oracle 10g. Script untuk membuat trigger ini berjalan dengan bersih.
CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
BEGIN
INSERT INTO Users (userID, firstName, lastName, password) VALUES ('how', 'im', 'testing', 'this trigger')
END;
/
Tetapi ketika saya jalankan:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
untuk mengaktifkan pemicu, saya mendapatkan pesan kesalahan ini:
ORA-04098: pemicu 'JMD.NEWALERT' tidak valid dan gagal validasi ulang (0 baris terpengaruh)
Saya tidak mengerti apa yang menyebabkan kesalahan ini. Apakah Anda tahu apa yang menyebabkan error ini? Atau mengapa hal ini terjadi?
Terima kasih sebelumnya!
-David
Oracle akan mencoba mengkompilasi ulang objek yang tidak valid seperti yang dirujuk. Di sini pemicunya tidak valid, dan setiap kali Anda mencoba memasukkan baris, pemicu akan mencoba mengkompilasi ulang pemicu, dan gagal, yang mengarah ke kesalahan ORA-04098.
Anda dapat select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'
untuk melihat kesalahan apa yang sebenarnya didapat oleh pemicu dan mengapa ia tidak dapat dikompilasi. Dalam kasus ini tampaknya Anda kehilangan titik koma di akhir baris insert
:
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
Jadi buatlah:
CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
BEGIN
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger');
END;
/
Jika Anda mendapatkan peringatan kompilasi ketika Anda melakukan itu, Anda dapat melakukan show errors
jika Anda berada di SQL*Plus atau SQL Developer, atau query user_errors
lagi.
Tentu saja, ini mengasumsikan tabel Pengguna
Anda memang memiliki nama kolom tersebut, dan semuanya varchar2
... tetapi mungkin Anda akan melakukan sesuatu yang lebih menarik dengan pemicu tersebut.
Penyebab: Pemicu dicoba untuk diambil untuk dieksekusi dan ternyata tidak valid. Ini juga berarti kompilasi/otorisasi gagal untuk pemicu tersebut.
Tindakan: Pilihannya adalah menyelesaikan kesalahan kompilasi/otorisasi, menonaktifkan pemicu, atau membatalkan pemicu.
Sintaks
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;