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

Çözüm

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:

INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')

Yap o zaman:

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;           
/

Bunu yaptığınızda bir derleme uyarısı alırsanız, SQL*Plus veya SQL Developer'daysanız show errors' yapabilir veyauser_errors'ı tekrar sorgulayabilirsiniz.

Elbette bu, Users tablolarınızın bu sütun adlarına sahip olduğunu ve hepsinin varchar2 olduğunu varsayar... ancak muhtemelen tetikleyici ile gerçekten daha ilginç bir şey yapacaksınız.

Yorumlar (2)

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

ALTER TRIGGER trigger Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;
Yorumlar (0)

Benim durumumda, bu hata sekans oluşturulmadığı için ortaya çıkıyor...

CREATE SEQUENCE  J.SOME_SEQ  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
Yorumlar (0)