您的位置:首页 > 数据库

SQL Server基础概念--触发器 <转载>

2010-03-22 09:54 513 查看
触发器是一种实施复杂的完整性约束的特殊存储过程。它在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

ref:http://database.51cto.com/art/200904/118363.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: