任务4 触发器的修改
DML触发器和DDL触发器的创建都可以使用T-SQL语句ALTER TRIGGER来实现,下面分别予以介绍。
1. 修改DML触发器
语法格式如下:
ALTER TRIGGER schema_name.trigger_name
ON ( table | view )
[ WITH <dml_trigger_option> [ ,...n ] ]
( FOR | AFTER | INSTEAD OF )
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier> [ ; ] }
2. 修改DDL触发器
语法格式如下:
ALTER TRIGGER trigger_name
ON { DATABASE | ALL SERVER }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type [ ,...n ] | event_group }
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>
[ ; ] }
}
【例】修改例14中所创建的触发器,将其所实现的功能修改为只提示不撤销。
本例代码如下:
USE 学生成绩管理系统
GO
/* CREATE TRIGGER PreventUpdate */
ALTER TRIGGER PreventUpdate
ON 学生 AFTER UPDATE
AS
BEGIN
IF UPDATE(学号)
BEGIN
PRINT ‘请注意,您当前修改的是学号字段!’
/* ROLLBACK TRANSACTION */
END
END
任务 触发器的删除
删除触发器可使用DROP TRIGGER语句来实现,其语法格式如下:
1. 删除DML触发器
DROP TRIGGER [schema_name.]trigger_name [ ,...n ] [ ; ]
2. 删除DDL触发器
DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER}[ ; ]
【例】删除 例题中所创建的DML触发器PreventUpdate。
本例代码如下:
IF EXISTS(SELECT * FROM sysobjects WHERE name=‘PreventUpdate’)
DROP TRIGGER PreventUpdate
【例】删除例题中所创建的DDL触发器PreventDropDatabase。
本例代码如下:
DROP TRIGGER PreventDropDatabase ON ALL SERVER
【例】删除例子中所创建的DML触发器PreventUpdate。
本例代码如下:
IF EXISTS(SELECT * FROM sysobjects WHERE name=‘PreventUpdate’)
DROP TRIGGER PreventUpdate
【例】删除例子中所创建的DDL触发器PreventDropDatabase。
本例代码如下:
DROP TRIGGER PreventDropDatabase ON ALL SERVER
任务 关闭和启用触发器
当不再需要某个触发器时,可将其关闭,关闭触发器不会删除该触发器。该触发器仍然作为对象存在于当前数据库中。但是,当执行任意lNSERT、UPDATE或DELETE语句(在其上对触发器进行了编程)时,触发器将不会激发。已关闭的触发器可以被重新启用。启用触发器会以最初创建它时的方式将其激发。默认情况下,创建触发器后会自动启用触发器。
关闭触发器有两种方法:
一种是通过SSMS,其步骤与使用SSMS修改触发器类似,只是在弹出的快捷菜单中选择“禁用”命令,如启用触发器,则选择“启用”命令。
另一种方法是使用T-SQL的ALTER TABLE语句,其语法格式如下:
ALTER TABLE 数据表名
DISABLE TRIGGER 触发器名
或
ENABLE TRIGGER 触发器名
Disable关键字是关闭触发器,Enable关键字是启用触发器,如要关闭或启用所有的触发器,使用参数ALL代替所有的触发器。
例: “禁用” [学生表]的触发器 [PreventDel]
ALTER TABLE 学生表
DISABLE TRIGGER PreventDel
例: “启用” [学生表]的触发器 [PreventDel]
ALTER TABLE 学生表
ENABLE TRIGGER PreventDel
例: “禁用” [学生表]的所有触发器
ALTER TABLE 学生表
DISABLE TRIGGER ALL
例: “启用” [学生表]的所有触发器
ALTER TABLE 学生表
ENABLE TRIGGER ALL
任务 运用SSMS管理触发器
通过SQL Server 2008图形界面方式可以创建、查看、修改、删除触发器。
1. 创建触发器
使用图形界面只能创建DML触发器,不能创建DDL触发器。
(1)在【对象资源管理器】窗口中,依次展开【数据库】→【学生成绩管理系统】→【表】→【学生】节点。
(2)在【触发器】节点上单击右键,选择【新建触发器】菜单项,打开【创建触发器】窗口,如图9.11所示。
(3)在上图所示的窗口中输入创建触发器的脚本,单击工具栏中的【执行】按钮,即可完成触发器的创建。
2. 查看触发器
用户可在图形界面中查看触发器的相关信息,因DML触发器和DDL触发器所依赖的对象不同,查看步骤也不一样。
(1)查看DML触发器
以触发器PreventDel为例,在图形界面中查看其相关信息的操作步骤如下:
在【对象资源管理器】窗口中,依次展开【数据库】→【学生成绩管理系统】→【表】→【学生】→【触发器】节点。选中触发器PreventDel,右键单击,在弹出的快捷菜单中选择【查看依赖关系】菜单项,打开【对象依赖关系】对话框,如图所示。
(2)查看DDL触发器
DDL触发器可分为数据库触发器、服务器触发器。查看数据库触发器:以学生成绩管理系统数据库为例,在【对象资源管理器】窗口中,依次展开【数据库】→【学生成绩管理系统】→【可编程性】→【数据库触发器】,即可看到当前数据库中的所有数据库触发器;查看服务器触发器:在【对象资源管理器】窗口中,依次展开【数据库】→【服务器对象】→【触发器】,即可查看到所有服务器触发器。
3. 修改触发器
使用图形界面只能修改DML触发器,不能修改DDL触发器。
4. 删除触发器
(1)删除DML触发器
以触发器PreventDel为例,在【对象资源管理器】窗口中,依次展开【数据库】→【学生成绩管理系统】→【表】→【学生】→【触发器】节点,右键单击触发器PreventDel,在弹出的快捷菜单中选择【删除】菜单项,在弹出的【删除对象】窗口中单击【确定】按钮即可删除该触发器。
(2)删除DDL触发器
删除DDL触发器的操作与删除DML触发器的操作类似,根据触发器所依赖的对象,找到需要删除的触发器,右键单击,在弹出的快捷菜单中选择【删除】菜单项即可。
要点小结:
触发器的作用及分类
创建AFTER类型和替代类型触发器
创建级联触发器
修改触发器
删除触发器
运用SSMS管理触发器
•
一、简答题
1、触发器的类型有哪些?
2、INSERTED表和DELETE表的作用各是什么?
二、上机实践题
1.在机上创建示例的触发器,并试用验证。
2.创建触发器TR_LEND1,当BookInfo(图书信息表)中该图书的在库数量(RemainNum)等于0时,则禁止向LendInfo(借阅表)中添加该图书的借阅信息。
3.创建触发器TR_LEND2,当LendInfo(借阅表)中有数据添加时,能自动更新StudentInfo(读者表)中该读者的借阅数量(LendBooks)及BookInfo(图书信息表)中该图书的在库数量(RemainNum)。