2023年8月3日发(作者:)

数据库应用技术—SQL Server 2008篇(第3版)

9.2.2 UPDATE触发器

对于UPDATE触发器,当UPDATE操作在表上执行时,则产生触发。在触发器程序中,有时只关心某些列的变化,则可以使用IF UPDATE(列名),仅对指定列的修改作出反应,这点是其他两种触发器没有的。

例9-4 在“客户信息”表上,建立一个UPDATE后触发器,当用户修改客户的“编号”列时,给出提示信息,并不能修改该列。

在查询设计器中运行如下的测试语句。

CREATE TRIGGER Check_CstNo ON 客户信息

AFTER UPDATE – –后触发器

AS

IF UPDATE(编号) – –针对该列的处理

BEGIN

RAISERROR('客户编号不能进行修改!',7,2) – –显示信息

ROLLBACK TRANSACTION

END

GO

– –测试该修改触发器

UPDATE 客户信息 SET 编号=8 WHERE 编号=7

GO

UPDATE 客户信息 SET 电话='80256716' WHERE 编号=6 – –修改电话成功

GO

– –修改编号失败

测试结果如图9-4所示。

图9-4 UPDATE后触发器的测试结果

在例9-1和例9-4中都用到了事务回滚语句(在9.5节将详细说明),需要指出的是,在触发188

2023年8月3日发(作者:)

数据库应用技术—SQL Server 2008篇(第3版)

9.2.2 UPDATE触发器

对于UPDATE触发器,当UPDATE操作在表上执行时,则产生触发。在触发器程序中,有时只关心某些列的变化,则可以使用IF UPDATE(列名),仅对指定列的修改作出反应,这点是其他两种触发器没有的。

例9-4 在“客户信息”表上,建立一个UPDATE后触发器,当用户修改客户的“编号”列时,给出提示信息,并不能修改该列。

在查询设计器中运行如下的测试语句。

CREATE TRIGGER Check_CstNo ON 客户信息

AFTER UPDATE – –后触发器

AS

IF UPDATE(编号) – –针对该列的处理

BEGIN

RAISERROR('客户编号不能进行修改!',7,2) – –显示信息

ROLLBACK TRANSACTION

END

GO

– –测试该修改触发器

UPDATE 客户信息 SET 编号=8 WHERE 编号=7

GO

UPDATE 客户信息 SET 电话='80256716' WHERE 编号=6 – –修改电话成功

GO

– –修改编号失败

测试结果如图9-4所示。

图9-4 UPDATE后触发器的测试结果

在例9-1和例9-4中都用到了事务回滚语句(在9.5节将详细说明),需要指出的是,在触发188