简单触发器的使用 -- 献给SQL初学者
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 1516
首先,啰嗦几句废话如下:(1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制。当使用UPDATE,INSERT或DEL

 

 

首先,啰嗦几句废话如下:

  (1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制。当使用UPDATEINSERT  或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。

  (2)触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求。

  (3)触发器能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。

  好,啰嗦完了开始贴代码,首先贴上我创建的两张表所包含的列,他们的关联关系是1对多,以UserID进行关联

 

sql

  然后来一个非常简单的触发器

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表已发生修改'

 

  上述代码中,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)

 

  OK,到这里就可以收工了,值得注意的是如果触发器是UPDATE触发的,那么在执行Update后再查询更新之前的数据改成查询deleted表即可。

本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。

联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2