程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle觸發器

Oracle觸發器

編輯:Oracle教程

Oracle觸發器


一.觸發器的概念理解。   數據庫觸發器是一個與表關聯的存儲下來的可以自動執行的PL/SQL程序。每當一個特定的數據操作語句在指定的表上發出時,Oracle自動的執行觸發器中定義的語句序列。比如,你要實現銀行卡數據的插入,插入姓名,數據庫就自動的為你插入卡的ID和你賬戶的ID,這樣的功能就可以使用觸發器來實現。當然,還有其他的作用。   一個表可以創建多個觸發器。   一個觸發器可以實現多個功能。   在觸發器中可以用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 結構來判斷哪種操縱觸發了觸發器從而來實現對應的觸發器功能。(相當於多個觸發器總合在一起)   觸發器是一把雙刃劍,添加了觸發器,在項目開發的過程中,如果遇到了工作交接,這時就必須溝通好,所以觸發器的注釋一定要寫好。   觸發器也可以調用存儲過程和存儲函數。   什麼情況下可能會用到觸發器:   1.數據確認。   2.實施復雜的安全性檢查。   3.做審計,跟蹤表上所做的數據操作等。   4.數據的備份和同步。   查詢觸發器: select * from user_triggers;   查詢觸發器、函數、過程: select * from user_source;   二.觸發器的分類。   語句級觸發器 語句級觸發器就是在數據操作前或者操作後執行的一次性的觸發器。不管這個操作影響了多少行。   行級觸發器 數據操作影響到的每一條記錄都被觸發,使用old和new偽記錄變量,識別值的狀態。   在行級觸發器中偽變量與觸發語句的適用。   觸發語句 :old :new insert 將要插入的數據 update 更新前該行的值 更新後的值 delete 刪除前該行的值 通過    :new.屬性值  來調用。 列級觸發器 列級觸發器僅限於update操作時才會觸發。   三.通過實例來創建觸發器。  
-----------觸發器的語法---------
CREATE [OR REPLACE] TRIGGER 觸發器名稱
{BEFORE|AFTER}    BEFORE|AFTER:觸發觸發器數據操作之前執行觸發器還是之後執行觸發器。
{DELETE|INSERT|UPDATE[OF列名]} DELETE|INSERT|UPDATE[OF列名]:觸發觸發器數據操作的類型。
ON 表名
[FOR EACH ROW [WHEN(條件)]]FOR EACH ROW:行級觸發器的關鍵字。WHEN:給行級觸發器加一個條件,滿足條件才執行,從而實現行級判斷。
PL/SQL塊

------------實現一個自動增長的ID列的觸發器-------------


--創建一個id,name的person表--
create table person(
id number primary key,
name varchar2(20) not null
);

---因為是自動增長的觸發器,所以要先創建一個增長的序列--
create sequence id_incr
start with 1001
increment by 1
nomaxvalue
nocycle
cache 10;

--------創建好序列之後就可以創建觸發器了------------------




--創建一個插入name時觸發ID自動插入的觸發器--

create or replace trigger id_tri
before
insert on person
for each row
declare
nextid number;
begin
select id_incr.nextval into nextid from dual;
:new.id:=nextid;
end;

-----所有准備工作完成就可以插入數據了----
insert into person(name) values('張三');
insert into person(name) values('李四');

select * from person;



-----------實現一個插入數據時判斷姓名是否以j開頭的觸發器-------------
表還是person表


create or replace trigger j_name
before
insert on person for each row
begin
if :new.name like 'j%' then
raise_application_error(-20000,'不能使用j開頭的姓名');
end if;
end;

 

insert into person(name) values('j雲霞');執行這條語句時就會拋出應用程序異常,提示不能使用j開頭的姓名。相當於高級的約束。          
------------------在觸發器中針對某種類型的觸發實現針對的功能---------
表還是person表

create or replace trigger is_what
before
insert or update or delete on person
begin
if inserting then
dbms_output.put_line('這是插入數據時觸發的');
elsif updating then
dbms_output.put_line('這是更新數據時觸發的');
else 
dbms_output.put_line('這是刪除數據時觸發的');
end if;
end;

 

使用下列三條語句體來檢測:
set serveroutput on;
insert into person(name) values('徐文帥');

set serveroutput on;
update person set name='張三' where name='徐文帥';

set serveroutput on;
delete person where name='張三';

 

  注意:is_what觸發器是語句級觸發器,所以你在增刪改檢測的時候,不論person有幾條語句被牽扯到,它只會put_line一條提示語句。這就是語句級觸發器和行級觸發器的一個區別。      
------------------------給id創建一個列級觸發器--------
create or replace trigger id_up
before update of id on person
begin
dbms_output.put_line('更新id的觸發器被觸發了');
end;



set serveroutput on;

 

update person set id=0000 where id='1001'; 這條語句執行的時候就會觸發id_up觸發器。   set serveroutput on; update person set name='aaa' where name='bbb';這條語句執行的時候就不會觸發id_up觸發器。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved