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

您好,我创建了一个触发器,用于检查表员工的薪水是否大于 1,000,000。如果薪水更高,则触发器应该停止执行存储过程中的插入语句。触发器已成功创建,但是当我插入一条薪水 > 1,000,000 的记录时,什么也没有发生。(记录被插入 - 这不应该发生)任何想法?

4

1 回答 1

3

您正在捕获异常,因此触发器不会引发错误。由于触发器不会引发错误,因此INSERT语句会继续并最终成功。如果您碰巧serveroutput在会话中启用,您会看到“Salary too high”消息,但您不应该依赖写入dbms_output缓冲区的数据被任何人读取。

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

IF( :new.salary > 1000000 )
THEN
  RAISE_APPLICATION_ERROR( -20001, 'Salary too high' );
END IF;
于 2013-10-06T01:13:06.557 回答