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)允许采取多个不同的对策以响应同一条修改语句。
触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
使用触发器的缺点:
触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们 可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要屏障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。