觸發器學習筆記(:new,:old用法)
觸發器是資料庫發生某個操作時自動執行的一類的程式
用於保持資料的完整性或記錄資料庫操作資訊方面
觸發器不能夠被直接呼叫,只能夠在某些事件發生時被觸發,也就是系統自動進行呼叫觸發器的構建語法 www.2cto.com
create [or replace] trigger trigger_name
before|after
event1 [ or event2 or event3 …]
on table_name [for each row]
begin
statement;
… end;
event通常是insert、delete或update等dml操作
說明:
for each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的 話,表示是表級觸發器,則無論操作多少行,都只觸發一次;
when條件的出現說明了,在dml操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 後的條件不為真的時候,觸發器只是簡單地跳過了pl/sql塊.
www.2cto.com
觸發器分為語句級觸發器和行級觸發器
語句級觸發器是指每執行一條dml語句,該觸發器就執行一次
行級觸發器是指每個dml操作影響幾條記錄,就會觸發幾次(for each row)
行級觸發器中由於涉及到了每條記錄的資料變動,所以對於每條記錄的資料來說就有新值和舊值之分
關鍵字:
:new 和:old使用方法和意義,new 只出現在insert和update時,old只出現在update和delete時。在insert時new表示新插入的行資料,update時new表示要替換的新資料、old表示要被更改的原來的資料行,delete時old表示要被刪除的資料。
示例(1)
--記錄運算元據庫資訊方面
--建立乙個t_emp2_log表用於儲存使用者對emp2表所做的操作資訊
create table t_emp2_log(
t_id number(10) primary key, --編號
t_date date, --修改日期
t_user varchar2(20), --操作使用者
action varchar(20) --該使用者所做操作
);
--建立觸發器t_emp2,當有使用者對錶emp2操作的時候,就會觸發該觸發器,記錄改使用者對錶emp2所做的操作
create or replace trigger t_emp2
after update or delete or insert on emp2
begin
if updating then --當執行更新操作時執行
insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user, 'update');
elsif deleting then --當執行刪除操作時執行
insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user, 'delete');
elsif inserting then -- 當執行插入操作時
insert into t_emp2_log values(seq_t_emp2_log.nextval, sysdate, user, 'inserting');
end if;
end;
示例(2)
--保持資料的完整性...
create table dept2 as select * from dept;
--當存在依賴表時,當主表的資訊發生改變時,依賴表的相應資訊也會發生改變
create or replace trigger tr_emp2
--當主表dept2發生改變時,
after update on dept2 for each row
begin
--依賴表也會發生相應的變化,以保持資料的完整性
update emp2 e set e.deptno = :new.deptno where e.deptno = :old.deptno;
end;
示例 (3)
兩個表 字段完全一樣
例如:emp 表 emp_ copy 表
要求 :寫乙個觸發器
功能實現
當往emp表內新增欄位且deptno=10的時候 往emp_copy表copy此資料
在emp表更新資料時且修改deptno=10 的時候 往emp_copy表copy此資料
www.2cto.com
--向emp_copy表copy新資料
--emp_copy可以存在相同的記錄
create or replace trigger tr_emp_copy
after insert or update on emp2 for each row
begin
if inserting then
if :new.deptno = 10 or :old.deptno = 10 then
insert into emp_copy values(:new.empno, :new.ename, :new.job,
:new.mgr,:new.hiredate, :new.sal, :new.comm, :new.deptno);
end if;
elsif updating then
if :old.deptno = 10 then
insert into emp_copy values(:new.empno, :new.ename, :new.job,
:new.mgr,:new.hiredate, :new.sal, :new.comm, :new.deptno);
end if;
end if;
end;
--注意事項
/* 不管是after ,還是 before 在update , insert , delete 時,一定是在事務提交之後才會觸發觸發器
before 和after的區別:before:insert update 可以對new進行修改。
after :不能對new 進行修改
二者都不能對old 進行修改
*/ create or replace trigger tri_emp2
before update on dept2 for each row
begin
:new.deptno := 80;
update emp2 e set e.deptno = :new.deptno where e.deptno = :old.deptno;
end;
mysql觸發器new old用法詳解
1.當使用insert語句的時候,如果原表中沒有資料的話,那麼對於插入資料後表來說新插入的那條資料就是new,如圖所示 2.當使用delete語句的時候,刪除的那一條資料相對於刪除資料後表的資料來說就是od,如圖所示 3.當使用update語句的時候,當修改原表資料的時候相對於修改資料後表的資料來說...
Oracle觸發器和new old特殊變數
new 為乙個引用最新的列值 old 為乙個引用以前的列值 這兩個變數只有在使用了關鍵字 for each row 時才存在.且update語句兩個都有,而insert只有 new delect 只有 old 系統中的觸發器例項 create or replace trigger jbpm.tib ...
Oracle觸發器和new old特殊變數
new 為乙個引用最新的列值 old 為乙個引用以前的列值 這兩個變數只有在使用了關鍵字 for each row 時才存在.且update語句兩個都有,而insert只有 new delect 只有 old 示例 create or replace trigger trigger cms zizh...