简单触发器的使用 献给SQL初学者
来源:asp之家 发布时间:2011-09-30 11:27:49
首先,啰嗦几句废话如下:
(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表即可。


猜你喜欢
- 作为微软推出的网页与数据库解决方案,ASP由于有微软得天独厚的操作系统等技术后盾支持,因此得到了迅速的发展,并且正受到越来越多的欢迎,在目前
- 我们开发数据库应用时,常常需要用到模糊查询。如果同一个条件需要匹配很多字段怎么办呢?通常,程序员会每个字段都在SQL中“field like
- 如下所示:# coding = utf-8import requestsimport jsonhost = "http://47.
- 前言python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用su
- 今天 大白 问了一个关于CSS权重的问题:关于选择器权重的问题 。class的权重是10 标签权重是 1 。比如说 p span{} 权重是
- 连续活跃登陆的用户指至少连续2天都活跃登录的用户解决类似场景的问题创建数据CREATE TABLE test5active(dt strin
- 入门 Kibo不依赖任何东西。你只要把它放到你的HTML代码里就行了: <script type="text/javascr
- Python打包分发工具setuptools:曾经 Python 的分发工具是 distutils,但它无法定义包之间的依赖关系。setup
- Microsoft SQL Server 2008将包含用于合并两个行集(rowset)数据的新句法。根据一个源数据表对另一个数据表进行确定
- 目的描述:为了让没有安装Python的人也能使用我们编写的.py文件,我们需要将编写好的Python程序生成.exe文件。第一步 下载pyi
- 1 前言前面的文章中我们已经获取到了基金的阶段变动信息和ETF信息的获取,那么在本章中,我们将继续前面的内容,获取基金的价格信息,并且把之前
- 前言:因为InnoDB是支持事务的,所以只对InnoDB的事务进行讨论。一、事务(一)什么是事务事务是由一组SQL语句组成的逻辑处理单元,是
- 设计单个页面,一点一点做就行了,但处理的页面多了,每个页面都一点点的做下去是非常费时费力的,特别是当许
- 上篇更新到pygame实现俄罗斯方块游戏(AI篇2) ,原本应该继续做优化,不过考虑到完成游戏完整性,这张就先把对战做好。一、对战的方块管理
- 不喜欢Python的人经常会吐嘈Python运行太慢。但是,事实并非如此。尝试以下六个窍门,来为你的Python应用提速。窍门一:关键代码使
- 这里假定Postgresql数据库已经装好。首先安装依赖的包$ sudo yum install python-devel postgres
- 本文实例讲述了python文件操作之目录遍历的方法。分享给大家供大家参考。具体分析如下:Python的os模块,包含了普遍的操作系统功能,这
- 生日送什么礼物总是要花一番心思,别出心裁不落俗套,什么礼物才能让那一个她开心呢?来看看前端大大用html+css实现动态生日快乐
- pycharm2019激活码是专门针对与pycharm2019这一款软件而研发的激活码,能够完美激活软件,并且能够支持2019.1版本,理论
- 1. defer的简单介绍与使用场景defer是Go里面的一个关键字,用在方法或函数前面,作为方法或函数的延迟调用。它主要用于以下两个场景: