PL/SQL 觸發器
阿新 • • 發佈:2019-01-29
1觸發器
本質上:也是一個儲存過程
1、儲存過程可以帶引數,觸發器沒有。
2、儲存過程可以主動呼叫,觸發器不能呼叫
分類1 DML觸發器 insert
DDL觸發器 create alter drop
系統觸發器(啟動、停止、登入、退出)
分類2 事前觸發器 before 事後觸發器after
分類3 行級觸發器 語句級觸發器
偽記錄(幻表):new old 偽記錄
insert 有new幻表 沒有old幻表
update 有new幻表 有old幻表
delete 沒有new幻表 有old幻表
before insert or update or delete
on busi_td_cart
for each row --行級觸發器
declare
-- local variables here
begin
--dbms_output.put_line('觸發器開始啦!');
--raise_application_error(-20001,'我會往外面拋一個異常');
if inserting then
--因為insert 操作而觸發
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的記錄有:'||:new.id);
elsif updating then
--因為update 操作而觸發
update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老記錄:'||:old.id||'新記錄:'||:new.id);
elsif deleting then
--因為delete操作而觸發
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被刪除的記錄有:'||:old.id);
end if;
end;
2條件謂詞:inserting updating deleting
注意:
觸發器不允許重複監聽
觸發器的打斷效果
/*
針對UserInfo表所有的觸發器,
事前觸發器
語句級觸發器
*/
create or replace trigger UserInfo_B_IDU
before insert or update or delete
on busi_td_cart
for each row --行級觸發器
declare
-- local variables here
begin
dbms_output.put_line('觸發器開始啦!');
raise_application_error(-20001,'我會往外面拋一個異常');
end;
3 觸發器的編譯過程
編譯 ——》編譯成功——》執行事前觸發器——》資料增刪改——》執行事後觸發器
raise_application_error(錯誤編號,錯誤資訊);
錯誤編號:寫負數,寫2000以後
錯誤資訊:寫字串
可以分開寫觸發器,監聽三種不同的操作;
也可以寫成一個觸發器,通過判斷不同的謂詞來區分。
觸發器和引發觸發器執行的增刪改行為 在同一個事務內 觸發器內部不允許寫commit或者rollback;
觸發器不允許操作本表
4 什麼時候沒有幻表?
只有增刪改的行級觸發器 才有幻表
5 DDL觸發器
create or replace trigger Global
after ddl
on LYJ.schema
declare
begin
--ora.sysevent() 記錄操作
--ora_dict_obj_type() 記錄型別
--org_dict_obj_name() 記錄名字
--org_login_user() 記錄登入的賬號
dbms_output.put_line('執行的操作'||ora_sysevent());
dbms_output.put_line('記錄型別'||ora_dict_obj_type());
dbms_output.put_line('記錄名字'||ora_dict_obj_name());
dbms_output.put_line('記錄登入的賬號'||ora_login_user());
end Global;
create or replace trigger trg_dbs_01
--after startup 服務開啟
--before shutdown 服務關閉
--after logon 登入成功
before logoff --退出登入
on database
declare
-- local variables here
begin
--用一張表的記錄記錄退出記錄
null;
end ;
6 管理觸發器
觸發器狀態:有效(啟用 禁用) 無效
禁止: alter trriger 觸發器名字 disable;
啟用: alter trriger 觸發器名字 enable;
全體禁止: alter table 表 disable all trrigers;
全體啟用: alter table 表 enable all enable;
自動失效:修改觸發器監聽的表的結構
生效:重新編譯觸發器
1、手工操作:找到觸發器 右鍵 Recompile
2、程式碼實現:alter trigger 名字 compile;
刪除: drop trigger 名
大型軟體系統 用得少 效能
級聯觸發器
最大32級級聯效果 效能下降非常嚴重
效能表現:1索引
2顯示遊標 (相當於一個容器物件)
3觸發器
本質上:也是一個儲存過程
1、儲存過程可以帶引數,觸發器沒有。
2、儲存過程可以主動呼叫,觸發器不能呼叫
分類1 DML觸發器 insert
DDL觸發器 create alter drop
系統觸發器(啟動、停止、登入、退出)
分類2 事前觸發器 before 事後觸發器after
分類3 行級觸發器 語句級觸發器
偽記錄(幻表):new old 偽記錄
insert 有new幻表 沒有old幻表
update 有new幻表 有old幻表
delete 沒有new幻表 有old幻表
before insert or update or delete
on busi_td_cart
for each row --行級觸發器
declare
-- local variables here
begin
--dbms_output.put_line('觸發器開始啦!');
--raise_application_error(-20001,'我會往外面拋一個異常');
if inserting then
--因為insert 操作而觸發
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的記錄有:'||:new.id);
elsif updating then
--因為update 操作而觸發
update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老記錄:'||:old.id||'新記錄:'||:new.id);
elsif deleting then
--因為delete操作而觸發
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被刪除的記錄有:'||:old.id);
end if;
end;
2條件謂詞:inserting updating deleting
注意:
觸發器不允許重複監聽
觸發器的打斷效果
/*
針對UserInfo表所有的觸發器,
事前觸發器
語句級觸發器
*/
create or replace trigger UserInfo_B_IDU
before insert or update or delete
on busi_td_cart
for each row --行級觸發器
declare
-- local variables here
begin
dbms_output.put_line('觸發器開始啦!');
raise_application_error(-20001,'我會往外面拋一個異常');
end;
3 觸發器的編譯過程
編譯 ——》編譯成功——》執行事前觸發器——》資料增刪改——》執行事後觸發器
raise_application_error(錯誤編號,錯誤資訊);
錯誤編號:寫負數,寫2000以後
錯誤資訊:寫字串
可以分開寫觸發器,監聽三種不同的操作;
也可以寫成一個觸發器,通過判斷不同的謂詞來區分。
觸發器和引發觸發器執行的增刪改行為 在同一個事務內 觸發器內部不允許寫commit或者rollback;
觸發器不允許操作本表
4 什麼時候沒有幻表?
只有增刪改的行級觸發器 才有幻表
5 DDL觸發器
create or replace trigger Global
after ddl
on LYJ.schema
declare
begin
--ora.sysevent() 記錄操作
--ora_dict_obj_type() 記錄型別
--org_dict_obj_name() 記錄名字
--org_login_user() 記錄登入的賬號
dbms_output.put_line('執行的操作'||ora_sysevent());
dbms_output.put_line('記錄型別'||ora_dict_obj_type());
dbms_output.put_line('記錄名字'||ora_dict_obj_name());
dbms_output.put_line('記錄登入的賬號'||ora_login_user());
end Global;
create or replace trigger trg_dbs_01
--after startup 服務開啟
--before shutdown 服務關閉
--after logon 登入成功
before logoff --退出登入
on database
declare
-- local variables here
begin
--用一張表的記錄記錄退出記錄
null;
end ;
6 管理觸發器
觸發器狀態:有效(啟用 禁用) 無效
禁止: alter trriger 觸發器名字 disable;
啟用: alter trriger 觸發器名字 enable;
全體禁止: alter table 表 disable all trrigers;
全體啟用: alter table 表 enable all enable;
自動失效:修改觸發器監聽的表的結構
生效:重新編譯觸發器
1、手工操作:找到觸發器 右鍵 Recompile
2、程式碼實現:alter trigger 名字 compile;
刪除: drop trigger 名
大型軟體系統 用得少 效能
級聯觸發器
最大32級級聯效果 效能下降非常嚴重
效能表現:1索引
2顯示遊標 (相當於一個容器物件)
3觸發器