简单触发器的使用 献给SQL初学者

时间:2024-01-17 18:27:18 

首先,啰嗦几句废话如下:
(1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制。当使用UPDATE,INSERT或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表已发生修改'
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表即可。

标签:触发器
0
投稿

猜你喜欢

  • Go语言函数的延迟调用(Deferred Code)详解

    2024-02-19 13:16:19
  • python 函数定位参数+关键字参数+inspect模块

    2023-07-05 23:04:37
  • 如何卸载python插件

    2023-11-21 22:24:31
  • CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)

    2023-11-21 21:42:33
  • VML模拟Rose画流程图代码

    2008-09-02 10:58:00
  • ImageMagicK convert crop参数说明

    2008-10-21 12:46:00
  • python 如何调用 dubbo 接口

    2022-09-28 13:20:13
  • 带你了解HDFS的Namenode 高可用机制

    2023-12-08 10:20:45
  • vue嵌套组件传参实例分享

    2024-06-07 15:23:11
  • 如何让shell终端和goland控制台输出彩色的文字

    2023-07-13 03:24:56
  • Python中random模块用法实例分析

    2023-01-02 19:40:25
  • ASP万用分页程序

    2007-09-21 12:45:00
  • 价值3亿美元的按钮[译]

    2009-03-18 19:39:00
  • 关于matlab图像滤波详解(二维傅里叶滤波)

    2022-04-16 19:51:35
  • MySQL数据库在Linux下二进制日志恢复方法

    2009-07-30 08:55:00
  • Python实现读取Properties配置文件的方法

    2021-01-05 17:28:21
  • Python缓存方案优化程序性能提高数据访问速度

    2022-04-11 20:36:15
  • bootstrap实现二级下拉菜单效果

    2024-04-17 10:40:42
  • Clion ROS开发环境设置技巧

    2023-11-01 02:36:32
  • ASP 精华源码收集(五年总结)第1/20页

    2011-04-07 11:15:00
  • asp之家 网络编程 m.aspxhome.com