SQL_触发器

触发器:是一种实施复杂的,完整性约束的特殊存储过程.

它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则

触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
触发器通常用于强制业务规则
触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列

触发器定义在特定的表上,与表相关。
 自动触发执行
 不能直接调用
 是一个事务(可回滚)

修改操作 inserted表 deleted表
增加(INSERT)记录 存放新增的记录 ------
删除(DELETE)记录 ----- 存放被删除的记录
修改(UPDATE)记录 存放更新后的记录

存放更新前的记录

insert 触发器:当向表中插入数据时触发,自动执行触发器中定义的SQL语句

delete触发器:当删除表中记录时触发,自动执行触发器中定义的SQL语句

update触发器:当更新表中某列或多列时触发,自动执行触发器中定义的SQL语句

update触发器无论是对表中的一行或多行,还是一列或多列,都将执行触发器操作。但是在实际需求中,可能只关心对特定列是否被更新。如果特定的列被更新,就执行触发器操作。这可以通过列上的update语法:if update<列名>来实现。在同一个触发器的定义语句中,可以使用多条if update 语句来对不同的列的修改执行不同的触发器操作。

instead of触发器的使用范围,instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
有可能要回滚修改的SQL语句
在视图中使用触发器
用自己的方式去修改数据

语法:

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR [DELETE, INSERT, UPDATE]
 AS
  T-SQL语句
GO

alter trigger tr_insert_recordinfo on recordinfo for insert as declare @cardid int, @pcid int, @carnember varchar(20)

begin  

select @pcid=pcid ,@cardid=cardid from inserted   update pcinfo set pcuse=1 where pcid=@pcid  

select @carnember=cardnumber from cardinfo where cardid =@cardid  

print '上机成功'

end;

declare @carid int

select @carid=cardid from cardinfo where cardnumber='023-003'

insert into recordinfo(cardid,pcid,begintime) values(@carid,1,GETDATE())

使用触发器的优点:

触发器可以强制比用check约束定义的约束更为复杂的约束。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一张表中的多个同类触发器(insert、       update或delete)允许采取多个不同的对策以响应同一条修改语句。
触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
使用触发器的缺点:
 触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们  可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要屏障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

posted @ 2013-05-21 11:26  狐狸不会飞  阅读(217)  评论(0编辑  收藏  举报