我试图在oracle 10g数据库中创建一个简单的触发器.此脚本创建触发器运行正常.
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; /
但是当我跑:
INSERT INTO Alerts(observationID,dateSent,message,dateViewed) VALUES (3,CURRENT_TIMESTAMP,'Alert: You have exceeded the Max Threshold',NULL);
要激活触发器,我得到这个错误消息:
ORA-04098: trigger ‘JMD.NEWALERT’ is invalid and Failed re-validation
(0 rows affected)
我不明白是什么导致这个错误.你知道是什么原因导致这个错误?或者为什么会发生这种情况?
先谢谢你!
-大卫
解决方法
Oracle将尝试重新编译被引用的无效对象.这里的触发器无效,每次尝试插入一行时,它将尝试重新编译触发器,并且失败,这将导致ORA-04098错误.
您可以从user_errors中选择*,其中type =’TRIGGER’和name =’NEWALERT’来查看触发器实际获取的错误以及为什么不能编译.在这种情况下,您似乎在插入行末尾缺少一个分号:
INSERT INTO Users (userID,password) VALUES ('how','this trigger')
所以做:
CREATE OR REPLACE TRIGGER newAlert AFTER INSERT OR UPDATE ON Alerts BEGIN INSERT INTO Users (userID,password) VALUES ('how','this trigger'); END; /
如果您在执行此操作时收到编译警告,则可以在sql * Plus或sql Developer中显示错误,或再次查询user_errors.