CREATE OR REPLACE trigger million_trigger
BEFORE INSERT or UPDATE on employee
FOR EACH ROW
WHEN (new.SALARY>1000000)
DECLARE
txt EXCEPTION;
BEGIN
if INSERTING or UPDATING then
RAISE txt ;
end if;
EXCEPTION
WHEN txt THEN
DBMS_OUTPUT.PUT_LINE('SALARY TOO HIGH');
end;
/
您好,我创建了一个触发器,用于检查表employee的薪水是否大于1,000,000。如果工资更高,则触发器应该停止从存储过程执行insert语句。触发器已成功创建,但是当我插入带有工资>的记录时1,000,000没有任何反应。 (记录被插入 - 这不应该发生)任何想法?
答案 0 :(得分:3)
您正在捕获异常,因此触发器不会引发错误。由于触发器不会抛出错误,INSERT
语句会继续,并最终成功。如果您恰好在会话中启用了serveroutput
,您会看到“工资太高”的消息,但您绝不应该依赖写入任何人正在阅读的dbms_output
缓冲区的数据。
如果要停止执行INSERT
语句,则需要删除异常处理程序。最有可能的是,您还希望更改引发异常的方式
IF( :new.salary > 1000000 )
THEN
RAISE_APPLICATION_ERROR( -20001, 'Salary too high' );
END IF;