简单触发器的使用 -- 献给SQL初学者
2011-09-05 16:31
183 查看
第一次在园子发文,先发一篇并非我最擅长的关于SQL的东西,欢迎大家送鲜花或者砸鸡蛋,当然更渴望的是能和大家多交流。
首先,啰嗦几句废话如下:
(1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制。当使用UPDATE,INSERT 或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。
(2)触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求。
(3)触发器能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。
好,啰嗦完了开始贴代码,首先贴上我创建的两张表所包含的列,他们的关联关系是1对多,以UserID进行关联。
然后来一个非常简单的触发器
上述代码中,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。代码如下:
OK,到这里就可以收工了,值得注意的是如果触发器是UPDATE触发的,那么在执行Update后再查询更新之前的数据改成查询deleted表即可。
首先,啰嗦几句废话如下:
(1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制。当使用UPDATE,INSERT 或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器。
(2)触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求。
(3)触发器能够维持数据库的完整性,当执行插入、更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性。
好,啰嗦完了开始贴代码,首先贴上我创建的两张表所包含的列,他们的关联关系是1对多,以UserID进行关联。
然后来一个非常简单的触发器
IFEXISTS(SELECT*FROM sysobjects WHERE name='tr_Users_OnUpdate'AND TYPE='TR') DROPTRIGGER tr_Users_OnUpdate GO--这里呢创建触发器与存储过程类似(都是DDL) --先判断如否存在同名触发器就删除然后重建 CREATETRIGGER tr_Users_OnUpdate ON Users FORUPDATE ASPRINT ‘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。代码如下:
--添加留言的触发器 IFEXISTS(SELECT name FROM sysobjects WHERE name='tr_LeaveWord_Add'AND TYPE='TR') DROPTRIGGER tr_LeaveWord_Add GO CREATETRIGGER tr_LeaveWord_Add ON WordInfo FORINSERT ASUPDATE UserInfo SET LeaveCount=LeaveCount+1 WHERE UserID=(SELECTTOP1 UserID FROM Inserted) GO
OK,到这里就可以收工了,值得注意的是如果触发器是UPDATE触发的,那么在执行Update后再查询更新之前的数据改成查询deleted表即可。
相关文章推荐
- 简单触发器的使用 -- 献给SQL初学者
- 简单触发器的使用 献给SQL初学者
- <转>简单触发器的使用 -- 献给SQL初学者
- 简单触发器的使用 献给SQL初学者
- PL/SQL中触发器的简单使用
- 数据库(SQL)之trigger(触发器)的使用以及视图(view)的基本实现
- SQL Profiler的简单使用
- JAVA - Sql解析工具jsqlparser简单使用
- 利用navicat创建存储过程、触发器和使用游标的简单实例
- mybatis简单sql使用java注解而不是xml配置
- PL/SQL 一个简单游标的使用
- JAVA - Sql解析工具jsqlparser简单使用
- SQL 2000中的触发器使用(转)
- sql简单触发器
- oracle 10g 学习之PL/SQL简介和简单使用(10)
- 触发器的使用<sql>
- 关于Server Sql 2008触发器的使用
- [oracle编程]pl/sql --标量 复合变量以及游标的简单使用
- PL/SQL简单使用——导入、导出数据表
- SQL Server CLR 使用 C# 自定义存储过程和触发器