触发器的嵌套
当一个触发器执行时,能够触活另一个触发器,这种情况就是触发器的嵌套。在SQL Server 2005里,触发器能够嵌套到32层。
如果不想对触发器进行嵌套的话,可以通过【允许触发器激活其他触发器】的服务器配置选项来控制。但不管此设置是什么,都可以嵌套Instead Of触发器。设置触发器嵌套的选项更改方法为:
(1)打开Management Studio,在【对象资源管理】中,右击服务器名,并选择【属性】选项。
(2)单击【高级】节点。
(3)在【杂项】里设置【允许触发器激活其他触发器】为True或False。如图10所示:
图10 开启/关闭触发器嵌套
现在,在Northwind数据库里建一个操作记录表,用来记录所有数据表的操作,无论是对哪个数据表进行了插入、更新或删除,都可以把操作内容和操作时间记录到操作记录表里。下面是建立操作记录表的SQL语句:
CREATE TABLE 操作记录表(
编号 int IDENTITY(1,1) NOT NULL,
操作表名 varchar(50) NOT NULL,
操作语句 varchar(2000) NOT NULL,
操作内容 varchar(2000) NOT NULL,
操作时间 datetime NOT NULL
CONSTRAINT DF_操作记录表_操作时间 DEFAULT (getdate()),
CONSTRAINT PK_操作记录表 PRIMARY KEY CLUSTERED
(
编号 ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
为了简便起见,在操作记录表里,只建一个After Insert触发器,触发器的作用是输入一条语句:“数据库又有记录变动了”。在实际应用时,读者可自行修改成所需的代码。
CREATE TRIGGER 操作记录表_Insert
ON 操作记录表
AFTER INSERT
AS
BEGIN
print '数据库又有记录变动了'
END
GO
作为示例,只在类别表里建立一个After Insert触发器,当在类别表里插入一条记录的时候,该触发器向操作记录表里插入一条记录,而在操作记录表里插入记录时,将会触发操作记录表里的【操作记录表_Insert】触发器。
CREATE TRIGGER 类别_Insert
ON 类别
AFTER INSERT
AS
BEGIN
Declare
@类别名称 nvarchar(15),
@说明 nvarchar(max)
set @类别名称= (Select 类别名称 from inserted)
set @说明= (Select 说明 from inserted)
INSERT INTO 操作记录表(操作表名,操作语句,操作内容)
VALUES ('类别表','插入记录','类别名称:'+@类别名称+',说明:'+@说明)
END
GO
现在运行一下对类别表的插入语句
INSERT INTO 类别(类别名称,说明)
VALUES ('书籍','各类图书')
运行结果如图11所示:
图11 触发器嵌套被激活
在【消息】对话框可以看到“数据库又有记录变动了”,这说明,触发器已经被嵌套激活了。如果把【允许触发器激活其他触发器】的选项设为False,再看看运行结果:
图12 触发器嵌套没有被激活
如图2所示,现在没有“数据库又有记录变动了”的提示输出,说明嵌套的触发器没有被激活。
触发器的嵌套
当一个触发器执行时,能够触活另一个触发器,这种情况就是触发器的嵌套。在SQL Server 2005里,触发器能够嵌套到32层。
如果不想对触发器进行嵌套的话,可以通过【允许触发器激活其他触发器】的服务器配置选项来控制。但不管此设置是什么,都可以嵌套Instead Of触发器。设置触发器嵌套的选项更改方法为:
(1)打开Management Studio,在【对象资源管理】中,右击服务器名,并选择【属性】选项。
(2)单击【高级】节点。
(3)在【杂项】里设置【允许触发器激活其他触发器】为True或False。如图10所示:
图10 开启/关闭触发器嵌套
现在,在Northwind数据库里建一个操作记录表,用来记录所有数据表的操作,无论是对哪个数据表进行了插入、更新或删除,都可以把操作内容和操作时间记录到操作记录表里。下面是建立操作记录表的SQL语句:
CREATE TABLE 操作记录表(
编号 int IDENTITY(1,1) NOT NULL,
操作表名 varchar(50) NOT NULL,
操作语句 varchar(2000) NOT NULL,
操作内容 varchar(2000) NOT NULL,
操作时间 datetime NOT NULL
CONSTRAINT DF_操作记录表_操作时间 DEFAULT (getdate()),
CONSTRAINT PK_操作记录表 PRIMARY KEY CLUSTERED
(
编号 ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
为了简便起见,在操作记录表里,只建一个After Insert触发器,触发器的作用是输入一条语句:“数据库又有记录变动了”。在实际应用时,读者可自行修改成所需的代码。
CREATE TRIGGER 操作记录表_Insert
ON 操作记录表
AFTER INSERT
AS
BEGIN
print '数据库又有记录变动了'
END
GO
作为示例,只在类别表里建立一个After Insert触发器,当在类别表里插入一条记录的时候,该触发器向操作记录表里插入一条记录,而在操作记录表里插入记录时,将会触发操作记录表里的【操作记录表_Insert】触发器。
CREATE TRIGGER 类别_Insert
ON 类别
AFTER INSERT
AS
BEGIN
Declare
@类别名称 nvarchar(15),
@说明 nvarchar(max)
set @类别名称= (Select 类别名称 from inserted)
set @说明= (Select 说明 from inserted)
INSERT INTO 操作记录表(操作表名,操作语句,操作内容)
VALUES ('类别表','插入记录','类别名称:'+@类别名称+',说明:'+@说明)
END
GO
现在运行一下对类别表的插入语句
INSERT INTO 类别(类别名称,说明)
VALUES ('书籍','各类图书')
运行结果如图11.11所示:
图11 触发器嵌套被激活
在【消息】对话框可以看到“数据库又有记录变动了”,这说明,触发器已经被嵌套激活了。如果把【允许触发器激活其他触发器】的选项设为False,再看看运行结果:
图12 触发器嵌套没有被激活
如图12所示,现在没有“数据库又有记录变动了”的提示输出,说明嵌套的触发器没有被激活。