简单触发器的使用 献给sql初学者,使用sqlserver的朋友可以参考下。
首先,啰嗦几句废话如下:
(1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似c#中的事件处理机制。当使用update,insert或delete的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。
(2)触发器可以包含复杂的sql语句,主要用于强制复杂的业务规则或要求。
(3)触发器能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。
好,啰嗦完了开始贴代码,首先贴上我创建的两张表所包含的列,他们的关联关系是1对多,以userid进行关联。
然后来一个非常简单的触发器
代码如下:
if exists(select * from sysobjects
where name='tr_users_onupdate' and type='tr')
drop trigger tr_users_onupdate
go --这里呢创建触发器与存储过程类似(都是ddl)
--先判断如否存在同名触发器就删除然后重建
create trigger tr_users_onupdate
on users for update
as print ‘users表已发生修改'
go
上述代码中,tr_users_onupdate为触发器名称,users为表名。这触发器的作用是当向users表执行update时将打印“users表已发生修改”。
好了我们可以看到这个触发器的实用性不是很大,那么接下来呢我们再来学习下关于触发器里两种特殊的表“inserted”和“deleted”。这两张表主要用于触发器。deleted 表用于存储 执行delete 和 update操作时所影响的行的副本。而inserted 表则用于存储 insert 和 update 语句所影响的行的副本。那么我们看到执行update操作时都会有记录分别存储到“inserted”和“deleted”。其实理解起来不难deleted表存储的是update之前的记录,而inserted存储的呢则是update之后的记录,这里关于理论性东西我不再赘述,官方资料有更详细说明。
现在我们要做的就是本文的重点,当往wordinfo添加一条记录时,使用触发器使userinfo的相应记录的leavecount字段增加1。代码如下:
代码如下:
--添加留言的触发器
if exists(select name from sysobjects where name='tr_leaveword_add' and type='tr')
drop trigger tr_leaveword_add
go
create trigger tr_leaveword_add
on wordinfo for insert
as update userinfo set leavecount=leavecount+1
where userid=(select top 1 userid from inserted)
go
ok,到这里就可以收工了,值得注意的是如果触发器是update触发的,那么在执行update后再查询更新之前的数据改成查询deleted表即可。