trigger_when.txt

来自「orale培训教材包括了所有的sql说明和实例」· 文本 代码 · 共 56 行

TXT
56
字号
--验证行级触发器的when语句的作用是使触发器只对满足when 条件的行触发。
--update普通纪录sal=10001,被trigger挡住。job='PRESIDENT'因为WHEN条件不满足,TRIGGER未触发,UPDATE  OK
CREATE TRIGGER scott.salary_check 
    BEFORE 
    UPDATE ON scott.emp 
    FOR EACH ROW 
    WHEN (new.job <> 'PRESIDENT') 
    BEGIN
	--在trigger中以dept表的更改值更改emp(约束表)
 	IF :new.sal>10000
	  THEN
	   RAISE_APPLICATION_ERROR (-20506, 'salary too high');
	  END IF;
   END;

   insert into emp (empno,job,sal) values(4,'hunter',100);
   
   update emp set sal=10001  where empno=4;
           *
ERROR at line 1:
ORA-20506: salary too high
ORA-06512: at "SCOTT.SALARY_CHECK", line 5
ORA-04088: error during execution of trigger 'SCOTT.SALARY_CHECK'



   insert into emp (empno,job,sal) values(5,'PRESIDENT',100);
   update emp set sal=10001  where empno=5;
   --1 row updated.








--当一次更新多条纪录,触发器被多次触发,如果其中一次触发引起RAISE_APPLICATION_ERROR
--则dml不会成功。因为sql中把一句sql文当作一个单元。要么成功,要么失败。
--不能一句sql文更新3条纪录,两条成功,一条失败。
update emp set sal=10002  where (empno=5 or empno=4 or empno=7984);
   
------------------------------OLD.

   CREATE OR REPLACE TRIGGER scott.salary_check 
    BEFORE 
    UPDATE ON scott.emp 
    FOR EACH ROW 
    WHEN (old.job <> 'PRESIDENT') 
    BEGIN
	--在trigger中以dept表的更改值更改emp(约束表)
 	IF :new.sal>10000
	  THEN
	   RAISE_APPLICATION_ERROR (-20506, 'salary too high');
	  END IF;
   END;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?