触发器
是一种特殊的存储过程,它不能显式地调用,而是进行insert、delete、update时被自动低激活。总结一句话就是:用来实现对标实施完整性约束的。
SQL Server为每个触发器都创建了两个表:inserted和deleted表。它们是系统维护的,它们存在在内存中,不是在数据库中,这连个标的结构总是与被该触发器作用的标的结构相同。触发器执行与该触发器相连的这两个表也被删除。
Instead of 和After触发器
instead of 触发器用于替代(可以取代激发它的操作来执行)引起触发器执行的T-SQL语句。(用于视图和表)
after触发器用于语句执行之后。(用于表)
下面我用机房收费系统来说明一下存储过程怎样用
判断卡号是否存在,存在不能插入:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 邱慕夏 -- Create date: 2014-08-04 -- Description: 判断卡号是否存在 -- ============================================= CREATE TRIGGER TrigT_CardInsert ON T_Card AFTER INSERT AS if exists(select * from T_Card,inserted where T_Card.CardNo=inserted.CardNo)--判断是否存在该卡号 BEGIN print '此卡号已经存在'
rollback transaction --回滚事物 END GO
在新建查询中执行:
insert into T_Card_DAL(CardNo,RegisterDateTime,cash,Head,type,status) values('8','2014-07-30','300','001','固定用户','使用')
所以可见insert首先执行主外键约束,之后,执行insert语句,将insert语句存放在inserted表中。
退卡:退卡需要将T_Card表中CardNo为要删除的卡号相同的记录删除,T_Student表中删除CardNo相同的删除,向T_CancelCard表添加一条记录。
主外键的关系图:
从表中我们可以看到主键为StudentNo,外键为CardNo,就是T_student表中只能添加T_Card中已经存在的CardNo。
如果我们删除T_Card表中的CardNo的值时,会遇到约束,因为T_Student表中有一条该卡号的记录。因此我们不能直接删除,用Instead of来替代删除操作,首先删除T_Student表中的数据,之后再删除T_Card表中的数据。
USE [ReconsitutionChargev1.0_sys] GO /****** Object: Trigger [dbo].[TrigT_CardDelete] Script Date: 08/04/2014 15:16:47 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 邱慕夏 -- Create date: 2014-07-30 -- Description: 退卡 -- ============================================= ALTER TRIGGER [dbo].[TrigT_CardDelete] ON [dbo].[T_Card] instead of DELETE AS --声明变量 declare @cardNo varchar(8) declare @Cash numeric(18,0) declare @CancelHead varchar(10) declare @CancelDate varchar(10) --给变量赋值 select @cardNo =cardNo from deleted select @Cash = cash from deleted select @CancelHead = CancelHead from deleted set @CancelDate=CONVERT([varchar],getdate(),(120)) BEGIN delete T_student where cardno=@cardNo delete T_Card where CardNo=@cardNo insert into T_CancelCard(CardNo,Cash,CancelHead,CancelDate) values(@CardNo,@Cash,@CancelHead,@CancelDate) END
删除激发触发器的语句我们只写:
delete T_Card where CardNo='8'
触发器 |
作用 |
执行程序 |
针对 |
Instead of |
可以替代执行语句操作 |
约束在后 |
表和视图 |
After |
首先执行语句 |
约束在前 |
表 |
比较学习总是给我们很大收获,无论我们学习什么都要不断思考、实践、总结,之后这些东西才能都成为我们自己的,知识不是记忆的,而是总结的。上面只是一个小小的入门,有什么写的不对的地方,请大家多多指教。
原文地址:http://blog.csdn.net/qiumuxia0921/article/details/38361887