(trigger)觸發器的定義和做用

第一:觸發器(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

  

Sql代碼 複製代碼  收藏代碼
  1. create or replace trigger temp_trigger ---定義一個觸發器 temp_trigger   
  2. after|before|instead of                         ---指定觸發時機和觸發類型   
  3. insert|update|delete                            ---指定觸發事件   
  4. of columns_name on table_name         ---of & on 監控的表單和表列   
  5. referencing   
  6. old as old_value   
  7. new as new_value   
  8. for each row|for each statement         ---指定觸發次數(行和語句)   
  9. begin  
  10. codes   
  11. end;  
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

Sql代碼 複製代碼  收藏代碼
  1. create or replace trigger tri                   ---trigger tri   
  2. before insert or update on employee    
  3. referencing old as old_value   
  4.                    new as new_value   
  5. for each row   
  6. when(new_value.empid<>'14')             ---當插入的empid不等於14   
  7. begin  
  8. :new_value.salary:=2001;                    ---將插入的的salary更改爲2001   
  9. end;  
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代碼 複製代碼  收藏代碼
  1. insert into employee values(emp_seq.nextval,'Janney',10,'1');   ---插入一條數據   
  2.   
  3. update employee set employee.empname='Alex' where employee.empid='12';  --根新empid=15的數據  
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代碼 複製代碼  收藏代碼
  1. create table idiot(   
  2. i_id varchar2(255) primary key,   
  3. i_name varchar2(255),   
  4. i_add varchar2(255)   
  5. )  
create table idiot(
i_id varchar2(255) primary key,
i_name varchar2(255),
i_add varchar2(255)
)

 

  建立觸發器 tri_idiot

Sql代碼 複製代碼  收藏代碼
  1. create or replace trigger tri_idiot   
  2. before update or insert on idiot   
  3. begin  
  4. if user not in ('hjd'then  
  5. Raise_application_error(-20001,'You don’t have access to modify this table.');   
  6. end if;   
  7. end;  
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代碼 複製代碼  收藏代碼
  1. insert into idiot values(idi_seq.nextval,'daniel','武漢');   
  2. insert into idiot values(idi_seq.nextval,'justin','武漢');   
  3. insert into idiot values(idi_seq.nextval,'alex','南昌');  
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修改操做人員和時間和行爲

Sql代碼 複製代碼  收藏代碼
  1. ---複製一張表格 命名爲tem_employee 爲操做的表格--   
  2. create table tem_employee as select * from employee  
---複製一張表格 命名爲tem_employee 爲操做的表格--
create table tem_employee as select * from employee

  

Sql代碼 複製代碼  收藏代碼
  1. --建立一張 tem_employee_log記錄變化--   
  2. create table tem_employee_log(   
  3. l_who varchar2(50),   
  4. l_when date  
  5. )  
--建立一張 tem_employee_log記錄變化--
create table tem_employee_log(
l_who varchar2(50),
l_when date
)

   

Sql代碼 複製代碼  收藏代碼
  1. ---增長一column---   
  2. alter table tem_employee_log add(action varchar2(20));  
---增長一column---
alter table tem_employee_log add(action varchar2(20));

  建立觸發器 tri

Sql代碼 複製代碼  收藏代碼
  1. create or replace trigger tri   
  2. before insert or update or delate on temp_employee   
  3. declare                                                          -----聲明一變量   
  4. l_action tem_employee_log.action%type;   
  5. begin  
  6. if inserting then l_action:='insert';   
  7. elsif updating then l_action:='update';             --此處用elsif   
  8. elsif deleting then l_action:='delete';   
  9. else raise_application_error(-20001,'You should never ever get this error.');   
  10. end if;   
  11. insert into tem_employee_log values(user,sysdate,l_action);   
  12. end;  
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代碼 複製代碼  收藏代碼
  1. delete from tem_employee where tem_employee.empid='4';  
delete from tem_employee where tem_employee.empid='4';

 結果:


相關文章
相關標籤/搜索