触发器停止执行SQl查询

时间:2013-10-06 01:08:09

标签: sql oracle stored-procedures triggers

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没有任何反应。 (记录被插入 - 这不应该发生)任何想法?

1 个答案:

答案 0 :(得分:3)

您正在捕获异常,因此触发器不会引发错误。由于触发器不会抛出错误,INSERT语句会继续,并最终成功。如果您恰好在会话中启用了serveroutput,您会看到“工资太高”的消息,但您绝不应该依赖写入任何人正在阅读的dbms_output缓冲区的数据。

如果要停止执行INSERT语句,则需要删除异常处理程序。最有可能的是,您还希望更改引发异常的方式

IF( :new.salary > 1000000 )
THEN
  RAISE_APPLICATION_ERROR( -20001, 'Salary too high' );
END IF;