(trigger)觸發器的定義和作用
阿新 • • 發佈:2019-02-16
第一:觸發器(trigger)
觸發器(trigger)是指隱含執行的儲存過程procedure,當定義觸發器時必須要指定觸發事件和觸發的操作,通常觸發事件包括insert,update,delete語句,觸發器實際上就是一個pl/sql(procedure language/Structured Query Language).create trigger來建立觸發器;
第二:觸發器的作用;
a.允許/限制對錶的修改
b.自動派生列,如自增欄位
c.強制資料的一致性
d.提供審計和日誌記錄
e.防止無效的事務處理
f.啟動複雜的業務邏輯
第三:觸發器的語法;
Sql程式碼-
create
- after|before|instead of ---指定觸發時機和觸發型別
- insert|update|delete ---指定觸發事件
- of columns_name on table_name ---of & on 監控的表單和表列
- referencing
- old as old_value
- new as new_value
-
for
- begin
- codes
- end;
instead of 是一種單獨的出發機制,用來管理和執行view型別的資料表單
of &on 監控關鍵字 of 可以省區,on是必須留下的
第四:例子instance
a:建立一個行觸發器 tri
Sql程式碼- create or replace trigger tri ---trigger tri
-
before insert or update on employee
- referencing old as old_value
- new as new_value
- for each row
- when(new_value.empid<>'14') ---當插入的empid不等於14
- begin
- :new_value.salary:=2001; ---將插入的的salary更改成2001
- end;
觸發事件:
Sql程式碼- insert into employee values(emp_seq.nextval,'Janney',10,'1'); ---插入一條資料
- update employee set employee.empname='Alex' where employee.empid='12'; --根新empid=15的資料
結果:
分析:
對比發現,無論你修改或增加資料只要empid!=14,salary都固定在2001。
b:建立一個語句觸發器
建立一表單 idiot
Sql程式碼- create table idiot(
- i_id varchar2(255) primary key,
- i_name varchar2(255),
- i_add varchar2(255)
- )
建立觸發器 tri_idiot
Sql程式碼- create or replace trigger tri_idiot
- before update or insert on idiot
- begin
- if user not in ('hjd') then
- Raise_application_error(-20001,'You don’t have access to modify this table.');
- end if;
- end;
觸發事件
Sql程式碼- insert into idiot values(idi_seq.nextval,'daniel','武漢');
- insert into idiot values(idi_seq.nextval,'justin','武漢');
- insert into idiot values(idi_seq.nextval,'alex','南昌');
結果:
(在非hjd的使用者下執行)
此處的trigger是控制權限的
c:建立一個觸發器log修改操作人員和時間和行為
- ---複製一張表格 命名為tem_employee 為操作的表格--
- create table tem_employee as select * from employee
- --建立一張 tem_employee_log記錄變化--
- create table tem_employee_log(
- l_who varchar2(50),
- l_when date
- )
- ---增加一column---
- alter table tem_employee_log add(action varchar2(20));
建立觸發器 tri
Sql程式碼- create or replace trigger tri
- before insert or update or delate on temp_employee
- declare -----宣告一變數
- l_action tem_employee_log.action%type;
- begin
- if inserting then l_action:='insert';
- elsif updating then l_action:='update'; --此處用elsif
- elsif deleting then l_action:='delete';
- else raise_application_error(-20001,'You should never ever get this error.');
- end if;
- insert into tem_employee_log values(user,sysdate,l_action);
- end;
觸發語句
Sql程式碼- delete from tem_employee where tem_employee.empid='4';
結果: