我想在 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:触发器 'JMD.NEWALERT'无效,重新验证失败 (0 行受影响)
我不明白是什么导致了这个错误。你知道是什么导致了这个错误吗?或者为什么会发生这种情况?
非常感谢!
-大卫
Oracle 会尝试重新编译无效对象。这里的触发器是无效的,每次尝试插入记录时,都会尝试重新编译触发器,但都失败了,从而导致 ORA-04098 错误。
你可以 "select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'来查看触发器实际出了什么错误,以及为什么无法编译。在本例中,您似乎在
insert` 行末尾缺少了一个分号:
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
那就补上吧:
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;
/
如果出现编译警告,可以在 SQL*Plus 或 SQL Developer 中执行 "show errors",或再次查询 "user_errors"。
当然,这要假定你的 Users
表确实有这些列名,而且它们都是 varchar2
......但你可能会用触发器做一些更有趣的事情。
原因:尝试检索一个触发器以执行,但发现该触发器无效。这也意味着触发器的编译/授权失败。
操作:可选择解决编译/授权错误、禁用触发器或放弃触发器。
语法
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;