Oracle Trigger ORA-04098: trigger geçersiz ve yeniden doğrulama başarısız oldu
Oracle 10g veritabanında basit bir tetikleyici oluşturmaya çalışıyorum. Tetikleyiciyi oluşturmak için bu komut dosyası temiz çalışır.
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;
/
Ama koştuğum zaman:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
tetikleyiciyi etkinleştirmek için bu hata mesajını alıyorum:
ORA-04098: tetikleyici 'JMD.NEWALERT' geçersiz ve yeniden doğrulama başarısız oldu (0 satır etkilendi)
Bu hataya neyin sebep olduğunu anlamıyorum. Bu hataya neyin sebep olduğunu biliyor musunuz? Ya da bu neden oluyor?
Şimdiden teşekkür ederim!
-David
21
3
Oracle, geçersiz nesnelere atıfta bulunuldukça bunları yeniden derlemeye çalışacaktır. Burada tetikleyici geçersizdir ve her satır eklemeye çalıştığınızda tetikleyiciyi yeniden derlemeye çalışır ve başarısız olur, bu da ORA-04098 hatasına yol açar.
Tetikleyicinin gerçekte hangi hata(lar)ı aldığını ve neden derlenmediğini görmek için
select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'
yapabilirsiniz. Bu durumda, `insert' satırının sonunda bir noktalı virgül eksik gibi görünüyor:Yap o zaman:
Bunu yaptığınızda bir derleme uyarısı alırsanız, SQL*Plus veya SQL Developer'daysanız
show errors' yapabilir veya
user_errors'ı tekrar sorgulayabilirsiniz.Elbette bu,
Users
tablolarınızın bu sütun adlarına sahip olduğunu ve hepsininvarchar2
olduğunu varsayar... ancak muhtemelen tetikleyici ile gerçekten daha ilginç bir şey yapacaksınız.Nedeni: Bir tetikleyici yürütülmek üzere alınmaya çalışıldı ve geçersiz olduğu tespit edildi. Bu aynı zamanda tetikleyici için derleme/yetkilendirmenin başarısız olduğu anlamına gelir.
Eylem: Seçenekler derleme/yetkilendirme hatalarını çözmek, tetikleyiciyi devre dışı bırakmak veya tetikleyiciyi bırakmaktır.
Sözdizimi
Benim durumumda, bu hata sekans oluşturulmadığı için ortaya çıkıyor...