触发器是一种实施复杂的完整性约束的特殊存储过程。它在
SQL Server
进行某个特定的表修改时由
SQL Server
自动执行。触发器一般用于加强数据库的某些使用规则。当普通的约束(包括
CHECK
机制、
DEFAULT
机制、
RULE
机制)不足于加强数据的完整性时,就可以考虑使用触发器。触发器对于那些为不同的商务软件提供后台数据服务的大型系统特别有用。因为触发器可以为数据库建立独立于具体客户端软件的完整性规则。
触发器和表是紧密联系在一起的,任何触发器都是在特定的表上进行定义的,该表也称为触发器的触发表。由于在触发器中可以包含复杂的处理逻辑,因而在
下列情况
下应该
考虑使用触发器
:
(1)
强制比
CHECK
约束复杂的数据完整性。如需要引用其他表数据的检查是无法通过
CHECK
约束完成的,必须使用触发器加以实现。
(2)
使用自定义的错误信息。通过触发器,用户可以捕获破坏数据完整性的各种操作,并自由地调用预先定义的错误信息或动态地定制错误信息。约束、规则和默认值只能通过标准的系统错误信息传递错误信息。如果应用程序要求定制的错误信息和执行更加复杂的错误处理,那么必须使用触发器。
(3)
实现数据库中多张表的级联修改。
(4)
比较数据库修改前后数据的状态。大多数触发器都提供了跟踪
INSERT
、
UPDATE
或
DELETE
语句引起的数据变化的能力。因此用户可以方便地在触发器中找出或访问由于修改而发生数据变化的记录行。
(5)
维护非规范数据。用户可以使用触发器来保证非规范数据库环境中低级数据的完整性。
创建触发器的
语法格式
如下:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{ FOR | AFTER |INSTEAD OF } { [INSERT] [,] [UPDATE] [,] [DELETE] }
AS
[{ IF UPDATE (column_name)
…
}]
[{ AND | OR } UPDATE (column_name)
…
]
Sql_statement [
…
n]
其中,部分
参数含义
如下:
(1)
trigger_name
:所建立的触发器的名称。触发器的命名必须遵循
SQL Server
标示符的命名约定,并且在数据库中必须唯一。
(2)
table|view:
在其上建立触发器的基表或视图,有时也称为触发器表或触发器视图。
(3)
INSERT,UPDATE
和
DELETE
:该关键字指定当在表或视图上执行哪些数据修改操作时将激活触发器。
SQL Server
允许同一个触发器被一种或多种操作触发。
(4)
IF UPDATE
(
column_name
):指定当对基表内的某字段或某几个字段进行插入(
INSERT
)或修改(
UPDATE
)时,触发才起作用。
(5)
Sql_statement
:触发器在被触发之后所执行的数据库操作。在
SQL Server
中,一个触发器能够包含任意数量的
SQL
语句。
触发器虽然在强制数据完整性方面有着十分重要的地位,但是,作为一种
特殊存储过程
,它还有以下
几点约束
:
(1)
如果在一段批处理命令中使用
CREATE TRIGGER
命令时,
CREATE TRIGGER
命令必须是批处理命令的第一条。
(2)
在表中如果既有约束又有触发器,则在执行时,约束优先于触发器。而且如果在操作中触发器与约束发生冲突,触发器将不执行。
(3)
不允许在触发器程序中出现下列语句,否则
SQL Server
将拒绝执行:
i.
任何数据库对象的创建指令。例如:
CREATE DATABASE,CREATE TABLE
及
CREATE INDEX
等
ii.
任何数据库对象的删除指令。如
DROP DATABASE,CREATE TABLE,DROP PROCEDURE
等
iii.
所有的对象修改语句,如
ALTER TABLE
和
ALTER DATABASE.
iv.
TRIMCATE TABLE
命令
v.
SELECT INTO
命令
vi.
权限命令(
GRANT
和
REVOKE
)
vii.
UPDATE STATISTICS
语句
viii.
SELECT INTO
(因为该语句创建了一个表)
ix.
RECONFIGURE
语句
x.
LOAD,RESTORE DATABASE
和
LOG
xi.
所有的磁盘操作命令
(4)
触发器不允许创建在特定的表格上,虽然在创建时不会提示任何的错误,但所创建的触发器不会有任何作用。
(5)
TRUNCATE
命令不能触发可以被
DELETE
操作触发的触发器。
Inserted
表和
deleted
表是触发器专用的
临时虚拟表
。在
UPDATE
类型的触发器中,两者均有,
INSERT
中包含
inserted
表,
DELETE
中包含
deleted
表。且他们只能由创建他们的触发器引用。触发器工作完成后,与该触发器相关的两个表也会被删除。
INSERT
触发器和
UPDATE
触发器常用语确保用户某些复杂的、特殊的商业规则,并保证数据在插入数据表之前是有效的。
DELETE
触发器主要有两个用途
:首先是防止用户的错误的删除操作;其次是在用户删除某个记录时,自动实施级联删除,确保数据完整性。
如果在某触发器的执行过程中修改了另一个表,并触发了该表的触发器,这种情况称为
触发器嵌套
。使用嵌套触发器时,应考虑下列因素:
(1)
在默认情况下,触发器不允许递归调用。也就是说,触发器不能自己触发自己。
(2)
因为一个触发器是一个事务,所以在嵌套触发器中,如果任意一点失败,那么整个事务和数据的修改将全部回滚(数据完整性的一种保护机制),如果调试的话,请在其中添加适当的打印信息。
查看触发器信息
可以使用以下的系统存储过程:
(1)
sp_depends<tablename>
:用于查看触发器的名称。
(2)
sp_helptigger<tablename>
:用于查看触发器的类型和拥有者等初步的信息。
(3)
sp_helptext<triggername>
:用于查看触发器的定义文本。
在 SQL 企业管理器中,不能直接删除触发器,因此, 删除触发器 只能使用 T-SQL 中的 DROP TRIGGER 语句 。
ref: http://blog.csdn.net/guilin_gavin/archive/2009/01/09/3742065.aspx