?? trigger_when.txt
字號:
--驗證行級觸發器的when語句的作用是使觸發器只對滿足when 條件的行觸發。
--update普通紀錄sal=10001,被trigger擋住。job='PRESIDENT'因為WHEN條件不滿足,TRIGGER未觸發,UPDATE OK
--注意:在when語句中 新,舊值不用:,直接用 new,old 在when以外用:new,:old
CREATE TRIGGER salary_check
BEFORE
UPDATE ON 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -