儲存過程無法代替觸發器的特殊情況

2021-08-30 18:09:49 字數 1437 閱讀 8176

在這裡先解釋一下推崇用儲存過程代替觸發器的原因,當然這裡先要說明一下此概念受教於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事...