觸發(fā)器的嵌套
當(dāng)一個(gè)觸發(fā)器執(zhí)行時(shí),能夠觸活另一個(gè)觸發(fā)器,這種情況就是觸發(fā)器的嵌套。在SQL Server 2005里,觸發(fā)器能夠嵌套到32層。
如果不想對(duì)觸發(fā)器進(jìn)行嵌套的話,可以通過【允許觸發(fā)器激活其他觸發(fā)器】的服務(wù)器配置選項(xiàng)來控制。但不管此設(shè)置是什么,都可以嵌套Instead Of觸發(fā)器。設(shè)置觸發(fā)器嵌套的選項(xiàng)更改方法為:
(1)打開Management Studio,在【對(duì)象資源管理】中,右擊服務(wù)器名,并選擇【屬性】選項(xiàng)。
(2)單擊【高級(jí)】節(jié)點(diǎn)。
(3)在【雜項(xiàng)】里設(shè)置【允許觸發(fā)器激活其他觸發(fā)器】為True或False。如圖10所示:
圖10 開啟/關(guān)閉觸發(fā)器嵌套
現(xiàn)在,在Northwind數(shù)據(jù)庫(kù)里建一個(gè)操作記錄表,用來記錄所有數(shù)據(jù)表的操作,無論是對(duì)哪個(gè)數(shù)據(jù)表進(jìn)行了插入、更新或刪除,都可以把操作內(nèi)容和操作時(shí)間記錄到操作記錄表里。下面是建立操作記錄表的SQL語句:
CREATE TABLE 操作記錄表(
編號(hào) int IDENTITY(1,1) NOT NULL,
操作表名 varchar(50) NOT NULL,
操作語句 varchar(2000) NOT NULL,
操作內(nèi)容 varchar(2000) NOT NULL,
操作時(shí)間 datetime NOT NULL
CONSTRAINT DF_操作記錄表_操作時(shí)間 DEFAULT (getdate()),
CONSTRAINT PK_操作記錄表 PRIMARY KEY CLUSTERED
(
編號(hào) ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
為了簡(jiǎn)便起見,在操作記錄表里,只建一個(gè)After Insert觸發(fā)器,觸發(fā)器的作用是輸入一條語句:“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”。在實(shí)際應(yīng)用時(shí),讀者可自行修改成所需的代碼。
CREATE TRIGGER 操作記錄表_Insert
ON 操作記錄表
AFTER INSERT
AS
BEGIN
print '數(shù)據(jù)庫(kù)又有記錄變動(dòng)了'
END
GO
作為示例,只在類別表里建立一個(gè)After Insert觸發(fā)器,當(dāng)在類別表里插入一條記錄的時(shí)候,該觸發(fā)器向操作記錄表里插入一條記錄,而在操作記錄表里插入記錄時(shí),將會(huì)觸發(fā)操作記錄表里的【操作記錄表_Insert】觸發(fā)器。
CREATE TRIGGER 類別_Insert
ON 類別
AFTER INSERT
AS
BEGIN
Declare
@類別名稱 nvarchar(15),
@說明 nvarchar(max)
set @類別名稱= (Select 類別名稱 from inserted)
set @說明= (Select 說明 from inserted)
INSERT INTO 操作記錄表(操作表名,操作語句,操作內(nèi)容)
VALUES ('類別表','插入記錄','類別名稱:'+@類別名稱+',說明:'+@說明)
END
GO
現(xiàn)在運(yùn)行一下對(duì)類別表的插入語句
INSERT INTO 類別(類別名稱,說明)
VALUES ('書籍','各類圖書')
運(yùn)行結(jié)果如圖11所示:
圖11 觸發(fā)器嵌套被激活
在【消息】對(duì)話框可以看到“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”,這說明,觸發(fā)器已經(jīng)被嵌套激活了。如果把【允許觸發(fā)器激活其他觸發(fā)器】的選項(xiàng)設(shè)為False,再看看運(yùn)行結(jié)果:
圖12 觸發(fā)器嵌套沒有被激活
如圖2所示,現(xiàn)在沒有“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”的提示輸出,說明嵌套的觸發(fā)器沒有被激活。
觸發(fā)器的嵌套
當(dāng)一個(gè)觸發(fā)器執(zhí)行時(shí),能夠觸活另一個(gè)觸發(fā)器,這種情況就是觸發(fā)器的嵌套。在SQL Server 2005里,觸發(fā)器能夠嵌套到32層。
如果不想對(duì)觸發(fā)器進(jìn)行嵌套的話,可以通過【允許觸發(fā)器激活其他觸發(fā)器】的服務(wù)器配置選項(xiàng)來控制。但不管此設(shè)置是什么,都可以嵌套Instead Of觸發(fā)器。設(shè)置觸發(fā)器嵌套的選項(xiàng)更改方法為:
(1)打開Management Studio,在【對(duì)象資源管理】中,右擊服務(wù)器名,并選擇【屬性】選項(xiàng)。
(2)單擊【高級(jí)】節(jié)點(diǎn)。
(3)在【雜項(xiàng)】里設(shè)置【允許觸發(fā)器激活其他觸發(fā)器】為True或False。如圖10所示:
圖10 開啟/關(guān)閉觸發(fā)器嵌套
現(xiàn)在,在Northwind數(shù)據(jù)庫(kù)里建一個(gè)操作記錄表,用來記錄所有數(shù)據(jù)表的操作,無論是對(duì)哪個(gè)數(shù)據(jù)表進(jìn)行了插入、更新或刪除,都可以把操作內(nèi)容和操作時(shí)間記錄到操作記錄表里。下面是建立操作記錄表的SQL語句:
CREATE TABLE 操作記錄表(
編號(hào) int IDENTITY(1,1) NOT NULL,
操作表名 varchar(50) NOT NULL,
操作語句 varchar(2000) NOT NULL,
操作內(nèi)容 varchar(2000) NOT NULL,
操作時(shí)間 datetime NOT NULL
CONSTRAINT DF_操作記錄表_操作時(shí)間 DEFAULT (getdate()),
CONSTRAINT PK_操作記錄表 PRIMARY KEY CLUSTERED
(
編號(hào) ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
為了簡(jiǎn)便起見,在操作記錄表里,只建一個(gè)After Insert觸發(fā)器,觸發(fā)器的作用是輸入一條語句:“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”。在實(shí)際應(yīng)用時(shí),讀者可自行修改成所需的代碼。
CREATE TRIGGER 操作記錄表_Insert
ON 操作記錄表
AFTER INSERT
AS
BEGIN
print '數(shù)據(jù)庫(kù)又有記錄變動(dòng)了'
END
GO
作為示例,只在類別表里建立一個(gè)After Insert觸發(fā)器,當(dāng)在類別表里插入一條記錄的時(shí)候,該觸發(fā)器向操作記錄表里插入一條記錄,而在操作記錄表里插入記錄時(shí),將會(huì)觸發(fā)操作記錄表里的【操作記錄表_Insert】觸發(fā)器。
CREATE TRIGGER 類別_Insert
ON 類別
AFTER INSERT
AS
BEGIN
Declare
@類別名稱 nvarchar(15),
@說明 nvarchar(max)
set @類別名稱= (Select 類別名稱 from inserted)
set @說明= (Select 說明 from inserted)
INSERT INTO 操作記錄表(操作表名,操作語句,操作內(nèi)容)
VALUES ('類別表','插入記錄','類別名稱:'+@類別名稱+',說明:'+@說明)
END
GO
現(xiàn)在運(yùn)行一下對(duì)類別表的插入語句
INSERT INTO 類別(類別名稱,說明)
VALUES ('書籍','各類圖書')
運(yùn)行結(jié)果如圖11.11所示:
圖11 觸發(fā)器嵌套被激活
在【消息】對(duì)話框可以看到“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”,這說明,觸發(fā)器已經(jīng)被嵌套激活了。如果把【允許觸發(fā)器激活其他觸發(fā)器】的選項(xiàng)設(shè)為False,再看看運(yùn)行結(jié)果:
圖12 觸發(fā)器嵌套沒有被激活
如圖12所示,現(xiàn)在沒有“數(shù)據(jù)庫(kù)又有記錄變動(dòng)了”的提示輸出,說明嵌套的觸發(fā)器沒有被激活。
聯(lián)系客服