SQL Server触发器实战教程:Update与Delete事件应用

需积分: 9 2 下载量 65 浏览量 更新于2024-09-09 收藏 93KB DOC 举报
SQL触发器实例讲解是一份针对SQL Server数据库管理系统中触发器功能的详细教程。触发器是一种特殊类型的存储过程,它在数据库表的特定操作(如Insert、Update或Delete)发生时自动执行预定义的SQL代码,确保数据的一致性和完整性。 在SQL Server中,触发器主要用于以下几个方面: 1. 数据一致性维护:例如,在学生表(Student)和学生借书记录表(BorrowRecord)的例子中,当学生信息发生变化(如学号更新),触发器可以帮助确保关联的借书记录表中的学号也随之更新。创建一个Update触发器(如truStudent On Student for Update),其逻辑检查待更新的StudentID是否匹配,如果匹配,则更新BorrowRecord表中的相应记录。 2. 行级操作:触发器提供了一个行级操作的环境,允许在数据改变时进行实时校验或操作,避免手动处理复杂的业务规则。 3. 删除操作管理:如例子中的删除触发器,当学生毕业而需要删除其学号时,可以通过触发器同时删除相应的借书记录,确保数据关联性。在Delete触发器中,当一条记录被删除时,系统会自动将删除的记录放入Deleted表,然后在触发器中执行相应的逻辑,比如清除相关联的记录。 触发器内部有两个临时表,Inserted和Deleted,它们在数据库操作过程中扮演关键角色: - Inserted:在插入新记录时,记录将被暂时保存在此表中,直到正式插入到目标表。 - Deleted:在更新或删除操作中,旧的记录会被移到此表,以便触发器可以根据这些信息执行更新或删除操作后的清理工作。 总结起来,SQL触发器是数据库设计中的一个重要工具,它们确保了数据在各种操作下的正确同步和一致性,提高了数据库管理的效率和准确性。学习和理解触发器的工作原理及其使用场景,有助于提高SQL Server数据库开发者的编程技能和数据管理能力。
2011-09-01 上传
sqlserver触发器例子 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和 After触发器 SQL Server2000提供了两种触发器﹕Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。 一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 四﹕触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立﹐其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行﹐所以它可以对约束进行一些预处理。 五﹕使用T-SQL语句来创建触发器 基本语句如下﹕ create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement 六﹕相关示例﹕ 1﹕在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。 create trigger orderinsert on orders after insert as if (select status from goods,inserted where goods.name=inserted.goodsname)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滚﹐避免加入 end 2﹕在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。 create trigger orderinsert1 on orders after insert as update goods set storage=storage-inserted.quantity from goods,inserted where goods.name=inserted.goodsname 3﹕在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。 create trigger goodsdelete on goods after delete as delete from orders where goodsname in (select name from deleted) 4﹕在Orders表建立一个更新触发器﹐监视Orders表的订单日期(OrderDate)列﹐使其不能手工修改. create trigger orderdateupdate on orders after update as if update(orderdate) begin raiserror(' orderdate cannot be modified',10,1) rollback transaction end 5﹕在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表中一定存在。 create trigger orderinsert3 on orders after insert as if (select count(*) from goods,inserted where goods.name=inserted.goodsname)=0 begin print ' no entry in goods for this order' rollback transaction end --insert 触发器 create trigger tri_infoDetails_i on info_details after insert as declare @id int begin --delete from info_details where id= select @id=id from inserted; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG) select type,title,content,getdate(),1 from info_details where id=@id; --update info_details_index set content=content end; -- update触发器 --select top 0 type,title,content,getdate() as post_time,1 as flag into info_details_index from info_details; create trigger tri_infoDetails_u on info_details after update as declare @id int begin if exists(select 1 from inserted) if exists(select 1 from deleted) begin select @id=id from inserted; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG)select type,title,content,getdate(),-1 from info_details where id=@id; insert into info_details_index(TYPE,TITLE,content,POST_TIME,FLAG)select type,title,content,getdate(),1 from info_details where id=@id; end --update info_details_index set content=content end --delete触发器 create trigger tri_infoDetails_d on info_details after delete as declare @id int begin if exists(select 1 from deleted) begin insert into info_details_index(TYPE,TITLE, POST_TIME,FLAG) select type,title, getdate(),-1 from deleted info_details ; end end