第一:觸發器(trigger)sql
觸發器(trigger)是指隱含執行的存儲過程procedure,當定義觸發器時必需要指定觸發事件和觸發的操做,一般觸發事件包括insert,update,delete語句,觸發器實際上就是一個pl/sql(procedure language/Structured Query Language).create trigger來建立觸發器;app
第二:觸發器的做用;this
a.容許/限制對錶的修改spa
b.自動派生列,如自增字段日誌
c.強制數據的一致性code
d.提供審計和日誌記錄blog
e.防止無效的事務處理事件
f.啓動複雜的業務邏輯事務
第三:觸發器的語法;ci
create or replace trigger temp_trigger ---定義一個觸發器 temp_trigger 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 each row|for each statement ---指定觸發次數(行和語句) begin codes end;
instead of 是一種單獨的出發機制,用來管理和執行view類型的數據表單
of &on 監控關鍵字 of 能夠省區,on是必須留下的
第四:例子instance
a:建立一個行觸發器 tri
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;
觸發事件:
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
create table idiot( i_id varchar2(255) primary key, i_name varchar2(255), i_add varchar2(255) )
建立觸發器 tri_idiot
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;
觸發事件
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
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;
觸發語句
delete from tem_employee where tem_employee.empid='4';
結果: