SQL Server 触发器

什么是触发器?

触发器

触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

        触发器简介:

SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。

         美高梅正规网址, 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(  insert,delete, update)时就会激活它执行,触发器经常用于加强数据的完整性约束和业务规则等。在我看来触发器实际上就是一个事件,就像C#中,点击一个按钮会触发相应的操作。

触发器通常用于强制业务规则

        触发器的分类:

触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句、可引用其它

        (1)DML( 数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生DML事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句。         (2)DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发生(DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。         (3)登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。

表中的列

        其中DML触发器最为常用,根据DML触发器触发的方式不同又分为以下两种情况:

触发器定义在特定的表上,与表相关。

      (1)AFTER触发器:它是在执行INSERT、UPDATE、DELETE语句操作之后执行触发器操作。它主要是用于记录变更后的处理或检查,一旦发生错误,可以用Rollback Transaction语句来回滚本次扣件,不过不能对视图定义AFTER触发器。       (2)INSTEAD OF触发器:它在执行INSERT、UPDATE、DELETE语句操作之前执行触发器本身所定义的操作。而INSTEAD OF触发器是可以定义在视图上的。

自动触发执行

        INSERTED和DELETED

不能直接调用

        在SQL SERVER 2008中,DML触发器的实现使用两个逻辑表DELETED和INSERTED。这两个表是建立在数据库服务器的内存中,我们只有只读的权限。DELETED和INSERED表的结构和触发器所在的数据表的结构是一样的。当触发器执行完成后,它们也就会被自动删除:INSERED表用于存放你在操件insert、update、delete语句后,更新的记录。比如你插入一条数据,那么就会把这条记录插入到INSERTED表:DELETED表用于存放你在操作  insert、update、delete语句前,你创建触发器表中数据库。比如你原来的表中有三条数据,那么他也有三条数据。也就是说,我们可以使用这两个临时的驻留内存的表,测试某些数据修改的效果及设置触发器操作的条件。

是一个事务使用触发器的好处触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器允许采取多个不同的对策以响应同一个修改语句。

        触发器的优缺点:

DML触发器分为:

        触发器可通过数据库中的相关表实现级联更改,可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列,例如触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作。触发器也可以根据数据修改前后的表状态,再行采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

1、 after触发器

        与此同时,虽然触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用?过多触发器会造成数据库及应用程序的维护困难,同时对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。

a、 insert触发器

语法

b、 update触发器

        建立触发器

c、 delete触发器

1 CREATE TRIGGER 触发器名称
2 ON 表名
3 { FOR | AFTER | INSTEAD OF } 
4 { [ INSERT ] [ , ] [ DELETE ] [ , ] 
5    [UPDATE ] }
6 AS 
7   SQL 语句 [ ... n ] 

UPDATE 触发器创建触发的语法

        **删除触发器:**

CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR [DELETE, INSERT, UPDATE]AST-SQL语句GO

 

注意:WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型 insert 触发器示例

1 DROP TRIGGER 触发器名 [ , ... n ]
/*创建insert触发器,在上网记录表recordInfo上创建插入触发器*/create trigger tr_insert_recordInfoon recordInfofor insertas/*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/declare @cardId char()declare @PCId intdeclare @CardNumber char()/*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号*/select @PCId=PCId,@cardId=CardId from inserted/*根据电脑编号修改电脑的使用状态*/update PCInfo set PCUse= where PCId=@PCId/*根据卡的编号查询会员号*/select @CardNumber=CardNumber from cardinfo where CardId=@cardid/*显示上机成功的信息*/print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(),@PCId)go----插入测试数据,会员号为的上机set nocount on --不显示sql语句影响的记录行数declare @CardId int ---声明一个存储卡的编号的变量---根据会员号查处卡的编号select @cardId=cardid from cardinfo where cardNumber='c' ---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,getDate())----查看结果select * from recordInfoselect * from PCInfo

 

update触发器示例

          修改触发器:

---创建delete触发器,在上网记录表RecordInfo上创建删除触发器create trigger tr_delete_recordInfoon recordInfofor deleteasif exists(select * from sysobjects where name='backRecordInfo')----如果backrecordInfo表存在,就添加记录即可insert into backRecordInfo select * from deletedelse----创建backRecordInfo表,从deleted中获取被删除的数据select * into backRecordInfo from deletedprint'backRecordInfo表备份数据成功,备份表中的数据为:'select * from backRecordInfogo-------关键代码----------测试delete触发器,删除数据set nocount ondelete from recordInfo---查看结果print'记录表中的数据为:'select * from recordInfo

 

本文由美高梅官方网站发布于数据统计,转载请注明出处:SQL Server 触发器

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。