如何控制觸發器遞迴

2022-03-05 19:43:11 字數 2842 閱讀 8646

a

表update

後,取b

表某列再次

update

a表,這樣又觸發了a表的

update

觸發器,我的目的是只觸發一次,是否設定

nested triggers

選項關閉遞迴觸發器即可?

分析

首先,必須清楚觸發器遞迴的定義,觸發器有兩種遞迴方式:

1.直接遞迴

a表上的觸發器更改(插入/刪除/更新)a表資料,導致a表的觸發器再次觸發,這種狀況稱之為直接遞迴;

2.間接遞迴

a表上的觸發器更新b表資料,導致觸發b表觸發器;而b表觸發器又更改a表資料,導致a表觸發器再次觸發,這種狀況稱之為間接遞迴

解決方法選項配置(影響所有範圍的觸發器)

sql server提供了資料庫級和伺服器級配置來確定遞迴觸發器是否被允許:

1.伺服器級(使用儲存過程

sp_configure

進行配置)

server

trigger recursion

選項(sql server 2005)

決定是否允許伺服器級觸發器直接遞迴激發;當此選項設定為

1 (on

,預設值

)時,將允許伺服器級觸發器遞迴激發;當設定為

0 (off

)時,伺服器級觸發器不能遞迴激發。

nested triggers

選項決定是否允許觸發器間接遞迴激發;當此選項設定為

1 (on

,預設值

)時,將允許觸發器遞迴激發;當設定為

0 (off

)時,觸發器不能遞迴激發。

2.資料庫級

recursive_triggers

資料庫選項設定決定是否允許資料庫中的觸發器直接遞迴觸發;預設值為

off,不允許直接遞迴觸發。

該選項可以通過儲存過程sp_dboption設定;對於sql server 2005,還可以使用類似下面的t-sql設定:

alter

database [dbname]

setrecursive_triggers

on使用選項決定遞迴觸發器的行為時,需要注意的是選項設定的有效範圍:

nested triggers

選項決定所有的觸發器是否間接遞迴激發,這意味著這是乙個

sql server

例項級的選項,設定將影響所有的觸發器。

server

trigger recursion

選項是sql server 2005

中才有的(

sql server 2005

才有伺服器級觸發器)。

recursive_triggers

選項影響配置它的資料庫中的所有觸發器。

其他解決方法(針對特定的觸發器)

如果只希望特定的觸發器允許或者禁止觸發器,則sql server沒有選項可以做到;如果確實需要這樣的功能,可以在觸發器**中實現控制:

1.使用

update(列名

)函式此函式適用於對

update

的控制。對於"a表

update

後,取b

表某列再次

update a表"

,如果僅更新

a表的某些列才觸發

update

b,並且

b 表再次

update

a表不會包含

a表觸發

update

b的那些列,則在

a表的觸發器中,使用

ifupdate(列

)來確定是否應該

update

b即可。

2.使用

@@nestlevel

該變數值確定巢狀層數。

對於"a

表update

後,取b

表某列再次

update a表"

,如果觸發者不是乙個儲存過程, 則

update a 的a

表觸發器

@@nestlevel = 1,

到update b

時, b

表觸發器

@@nestlevel = 2, b

表觸發器再

update a

時, @@nestlevel = 3

。所以如果

@@nestlevel >=3 時,

一般表示遞迴了(當然

, 前提是

update a

的觸發器本身沒有兩層的遞迴

, 即不能是儲存過程再呼叫儲存過程去

update a。3.

使用@@procid

該全域性變數返**用者的

object_id

。如果需要

a表觸發

b表觸發器,而

b表觸發器再觸發

a表觸發器時,

a表觸發器不響應;則在

a表觸發器中使用它來判斷觸發者是誰

,如果是

b表觸發器

,則不處理就行了

,類似下面這樣:

ifobject_id

(n'b

表觸發器名稱')

=@@procid

begin

print

'b表觸發器

, 不處理

'return

end

如何控制觸發器遞迴

背景a 表update 後,取b 表某列再次 update a表,這樣又觸發了a表的 update 觸發器,我的目的是只觸發一次,是否設定 nested triggers 選項關閉遞迴觸發器即可?分析 首先,必須清楚觸發器遞迴的定義,觸發器有兩種遞迴方式 1 直接遞迴 a表上的觸發器更改 插入 刪除...

觸發器控制

在目標庫上建立資料幫浦目錄 create directory dump dir as oracle ppp grant read,write on directory dump dir to user 在源庫上匯出資料 expdp system oracle directory dump dir d...

sql 觸發器 直接遞迴觸發器

create trigger dbo loving20000 on dbo s for delete asdeclare age int select age sage from deleted delete s where sage age delete from s where sname xq...