在這裡先解釋一下推崇用儲存過程代替觸發器的原因,當然這裡先要說明一下此概念受教於itpub論壇的newkid版主的經驗。
直接進入正題,絕大多數的由觸發器提供的功能都可以用儲存過程都能實現,而觸發器是「隱式」執行,儲存過程是「顯式」執行,也就是說,當你對乙個表進行操作的時候,儲存過程出現於你的程式**中,出現問題可以被發覺,而觸發器是自動執行,如果它的出現了問題,你無法在**中找到它,因而會給造成不必要的麻煩。這就是推薦用儲存過程代替觸發器的主要原因。
但是,也有一些儲存過程無法代替觸發器的特例,如果2個表雙向都有外來鍵約束,比如t1表有b_id是t2表的b_id的外來鍵,而t2表的a_id則同時也是t1表a_id的外來鍵,那麼用觸發器可以實現2個表的資料更新,用儲存過程就沒有辦法做的,以下是對此做的乙個實驗:
---------------------------建表指令碼------------------------------
create table t1
(a_id number primary key,
b_id number
);create table t2
(b_id number primary key,
a_id number
);-----------------------------為2個表加上外來鍵-----------------------------------------
alter table t1
add constraint fk1
foreign key(b_id)
references t2(b_id);
alter table t2
add constraint fk2
foreign key(a_id)
references t1(a_id);
-------------------------觸發器--------------------------------
create or replace trigger tri_row_ins_t
after insert on t1
referencing new as n old as o
for each row
begin
insert into t2(b_id,a_id)
values(:n.b_id,:n.a_id);
end;
測試:sql> insert into t1 values(5,6);
1 row inserted
sql> commit;
commit complete
結論:觸發器是在語句被編譯後,約束條件被執行之前執行的,儲存過程則沒有辦法在約束條件之前執行,所以會有這種無法使用儲存過程代替觸發器的特例,當然以上條件的出現情況也不常見
綜上,再強調開頭那一段思想,在你想到使用觸發器的時候,再想一想怎樣用儲存過程來替代之是個比較好的習慣。
觸發器 儲存過程
1 為productsales資料庫中的產品表建立乙個名為update pno的update觸發器,該觸發器的作用是禁止更新產品表中的 productname 欄位的內容。並用update語句修改產品表中第一條記錄為 1 hp1500 印表機 2000 要求顯示 不能修改產品名稱 的警告資訊。cre...
儲存過程 觸發器
觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,就會自動執行觸發器所定義的sql 語句,從而確保對資料的處理必須符合由這些sql 語句所定義的規則。觸發器的主要作用就是其能夠實現由主鍵和外來鍵...
SQL 觸發器入門介紹 特殊的儲存過程
觸發器是一種特殊型別的儲存過程,它的功能是在指定的表中的資料發生變化時自動生效。觸發器與普通儲存過程的不同之處在於 觸發器的執行時由事件觸發,而普通儲存過程是由命令呼叫執行 exec sql server主要提供了一下兩種觸發器 1 dml觸發器 2 dll觸發器 當資料庫中發生資料操作語言dml事...