觸發器 REFERENCING OLD AS OLD
REFERENCING OLD AS OLD NEW AS NEW FOR EACH Row
CREATE OR REPLACE TRIGGER TRI_DELETE_INFO
AFTER DELETE ON T_INFO_2012
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
V_SQLERRM VARCHAR2(200);
BEGIN
DELETE FROM T_INFO_2013 WHERE CODE = :OLD.CODE;
--COMMIT; 觸發器中不可以使用COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_SQLERRM := '觸發器 TRI_DELETE_INFO 出錯:' || SQLERRM;
INSERT INTO PROCEDURE_LOG
(ERRMSG, ERRDATE)
VALUES
(V_SQLERRM, SYSDATE);
END;
1、For each row
的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;
2、REFERENCING OLD
和 REFERENCING NEW
的含義不同,具體取決於觸發器是行級還是語句級觸發器。對於行級觸發器,REFERENCING OLD
子句允許引用更新或刪除之前行中的值,REFERENCING NEW
子句允許引用已插入或更新的值。在 BEFORE
和 AFTER
觸發器中可以引用 OLD
和 NEW
行。REFERENCING NEW
子句允許在插入或更新操作發生之前在 BEFORE
觸發器中修改新行
3、:NEW
和:OLD
使用方法和意義,new
只出現在insert
和update
時,old
只出現在update
和delete
時。在insert
時new
表示新插入的行資料,update
時new
表示要替換的新資料、old
表示要被更改的原來的資料行,delete
時old
表示要被刪除的資料。
begin
前面出現的new
,old
不加冒號,begin
和end
之間出現的new
和old
都要在前面加上":"。
REFERENCING OLD AS OLD NEW AS NEW
這樣寫之後就可以在begin end
直接直接使用別名來引用。
觸發器中的:NEW
和 :OLD
的用法
觸發器是資料庫發生某個操作時自動執行的一類的程式
用於保持資料的完整性或記錄資料庫操作資訊方面
觸發器不能夠被直接呼叫,只能夠在某些事件發生時被觸發,也就是系統自動進行呼叫觸發器的構建語法
create [or replace] trigger trigger_name
before|after
event1 [ or event2 or event3 …]
on table_name [for each row]
begin
statement;
…
end;
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
通常是insert
、delete
或update
等DML操作
說明:
For each row
的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;
When
條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when
後的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL
塊.
觸發器分為語句級觸發器和行級觸發器
- 語句級觸發器是指每執行一條DML語句,該觸發器就執行一次
- 行級觸發器是指每個DML操作影響幾條記錄,就會觸發幾次(for each row)
- 行級觸發器中由於涉及到了每條記錄的資料變動,所以對於每條記錄的資料來說就有新值和舊值之分 (語句級觸發器不能用old和new)
關鍵字:
: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
表
要求 :寫一個觸發器
提示: :NEW :OLD
功能實現
當往emp
表內新增欄位且deptno=10
的時候 往emp_copy
表copy
此資料
emp
表更新資料時且修改deptno=10
的時候往emp_copy
表copy此資料
--向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;
相關文章
- windows.old可以刪除嗎?windows.old檔案的刪除方法Windows
- win10如何刪除windows.old_win10刪除windows.old的方法Win10Windows
- win10 如何刪除windows old win10怎麼刪除windows.oldWin10Windows
- PG 中返回update 前的值 :old
- 著名的ORA-1555:snapshot too old
- win10如何刪除更新 old_win10系統更新後怎麼刪除windows.oldWin10Windows
- [20231103]sqlplus column new_value old_value.txtSQL
- [20230303]sqlplus column new_value old_value.txtSQL
- Boring Old Menu Bar for Mac(選單欄美化工具)Mac
- win10 ghost系統windows.old可以刪除嗎_win10系統windows.old檔案怎麼刪除Win10Windows
- 選單欄美化的好幫手Boring Old Menu Bar for MacMac
- 《致命軀殼》開發商old Symmetry如何製作出掀起行業千層浪的作品?行業
- 一款「Old School」的戰棋手遊,憑什麼成為下一個新星?
- 《Star Wars: Old Republic》問世十年了,BioWare還在用它講述新故事
- rustlings v6.0 執行時出現 “ You are trying to run Rustlings using the old method before version 6”Rust
- D觸發器觸發器
- mysql觸發器MySql觸發器
- Boring Old Menu Bar for mac(Big Sur選單欄最佳化工具) v1.13啟用版Mac
- 一次JVM_OLD區佔用過高、頻繁Full GC的解決過程JVMGC
- MySql-觸發器MySql觸發器
- sqlserver 列觸發器SQLServer觸發器
- 除錯觸發器除錯觸發器
- 建立MySQL觸發器MySql觸發器
- SqlServer-觸發器SQLServer觸發器
- logon觸發器for dbaGo觸發器
- MySQL使用觸發器MySql觸發器
- 語句觸發器觸發器
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- 行為和觸發器觸發器
- MySQL觸發器介紹MySql觸發器
- sql-server觸發器SQLServer觸發器
- Oracle開發基礎-觸發器Oracle觸發器
- 曹工改bug:cpu狂飆,old gc頻繁,執行緒神祕死亡連環案件調查報告GC執行緒
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- MySQL入門-- TRIGGER(觸發器)MySql觸發器
- SQL Server:觸發器詳解SQLServer觸發器
- SQL Server 觸發器詳情HOPPSQLServer觸發器
- 禁止oracle表的觸發器triggerOracle觸發器