简单触发器的使用 献给SQL初学者
首先,啰嗦几句废话如下:
(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表即可。
相关推荐
-
数据库触发器(Trigger)的一点使用心得
(1) 针对较为复杂的跨多表的数据业务级别的约束,可以通过触发器来替代大量的后台判断代码,效率较高且便捷. (2) 如果想通过触发器辅助业务逻辑,不能单着眼于数据库内容的变化来设计触发器,还必须紧密结合业务模型中涉及该表的所有地方,因为很有可能因为不一致的逻辑处理方式导致我们设计的触发器遗漏下一些分支条件!其实,在这种情况下,如果能有更好的方法,不建议使用触发器,因为牵扯到过多的业务逻辑内容的话,会使触发器的设计和编写困难重重,不能充分发挥其便捷高效的优点. (3) 鉴于触发器在实际运行的时候,
-
SQL触发器实例讲解
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: 复制代码 代码如下: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord(
-
在登录触发器错误情况下连接SQL Server的方法
错误如图所示: 图一 如果不能很好地执行登录触发器,那么将会导致登录失败. 例如,如果创建了这个触发器,那么就可以设计下面的代码来达到失败的目的. 复制代码 代码如下: CREATE TRIGGER BadLogonTrigger ON ALL SERVER FOR LOGON AS BEGIN INSERT INTO BadDB.dbo.SomeTable VALUES ('Test'); END; GO 没有一个数据库称为BadDB,这意味着在BadDB内也没有一张表叫SomeTable.因
-
sqlserver 触发器教程
主类别表名:Navtion_TopSubject 主键fTopID Char(36) 次类别表名:Navtion_NodeSubject 外键同上 内容表名:tText 外键同上 复制代码 代码如下: // ------------- 代码开始 -------------------- CREATE TRIGGER [RemoveTopAndNodeText] ON [dbo].[Navtion_TopSubject] INSTEAD OF DELETE AS /* 定义触发器使用的变量 */
-
SQL Server 触发器 表的特定字段更新时,触发Update触发器
复制代码 代码如下: create trigger TR_MasterTable_Update on MasterTable after update as if update ([Type])--当Type字段被更新时,才会触发此触发器 insert into MasterLogTable select Id ,(Case [Type] when 1 then 'Type1' when 2 then 'Type2' when 3 then 'Type3' when 4 then 'Type4'
-
SQL Server触发器及触发器中的事务学习
如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和触发器中事务个故事.在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事.如果,你有什么建议和意见,都可以通过文章后面的回复与我沟通,或者通过E-Mail方式,与 我交流:我的Email地址是:glal@163.co
-
SQLServer 触发器 数据库进行数据备份
复制代码 代码如下: create table test3(id int primary key not null identity(1,1),uname varchar(20),uage int); create table test3_bak(id int primary key not null identity(1,1),bid int,uname varchar(20), uage int,active char(1)); 第二步,编写备份用的触发器,只有更新或者是插入的时候才触发 复
-
SQL Server 2000中的触发器使用
下面我摘录了SQL Server官方教程中的一段关于触发器的文字,确实有用的一点文字描述. 可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器. 当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中.inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本.inserted表包含了INSERT语句中已记录的插入动作.inserted表还允许引用由初始化INSERT语句而产生的日志数据.触发器通过检查inserted表来确定是否执行触发器动
-
简单触发器的使用 献给SQL初学者
首先,啰嗦几句废话如下: (1)触发器(trigger)是个特殊的存储过程,它的执行并不需要我们去显式调用,而是由一些事件触发,这有点类似C#中的事件处理机制.当使用UPDATE,INSERT 或DELETE的一种或多种对指定的数据库的相关表进行操作时,会触发触发器. (2)触发器可以包含复杂的SQL语句,主要用于强制复杂的业务规则或要求. (3)触发器能够维持数据库的完整性,当执行插入.更新或删除操作时,触发器会根据表与表之间的关系,强制保持其数据的完整性. 好,啰嗦完了开始贴代码,首先贴上我
-
分享两段简单的JS代码防止SQL注入
1.URL地址防注入: //过滤URL非法SQL字符 var sUrl=location.search.toLowerCase(); var sQuery=sUrl.substring(sUrl.indexOf("=")+1); re=/select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>|<|%/i; if(re.test(sQuery)) { alert("请勿
-
简单了解Mybatis如何实现SQL防注入
这篇文章主要介绍了简单了解Mybatis如何实现SQL防注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis这个框架在日常开发中用的很多,比如面试中经常有一个问题:$和#的区别,它们的区别是使用#可以防止SQL注入,今天就来看一下它是如何实现SQL注入的. 什么是SQL注入 在讨论怎么实现之前,首先了解一下什么是SQL注入,我们有一个简单的查询操作:根据id查询一个用户信息.它的sql语句应该是这样:select * from u
-
献给php初学者(入门学习经验谈)
1.概要:学习任何语言都需要 多看 多想 多写 多问!!写编程是一种熟能生巧的东西!因为知识就那么多,你看多了就会觉得怎么都一样. 程序员就是炒冷饭的,一遍又一遍.代码多敲几遍就可以闭着眼睛写了,所以企业招聘都会问你写过多少行代码的!!程序员最忌讳浮躁,有时候发现一段程序完全找不出错误,仅仅是因为少了或多了一个符号,程序员需要的是细心,粗心的人当不了程序员! 2.php参考手册是必须熟知的,有的初学者会问一些很基础的问题,其实手册上面都有,所以建议初学者先把手册看了,最好把常用函数抄几遍!!再敲
-
奉献给JavaScript初学者的编写开发的七个细节
(1)简化代码 JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的: 复制代码 代码如下: var car = new Object(); car.colour = 'red'; car.wheels = 4; car.hubcaps = 'spinning'; car.age = 4; 下面的写法可以达到同样的效果: 复制代码 代码如下: var car = { colour:'red', wheels:4, hubcaps:'spinning', age:4 }
-
MySQL与SQL的触发器的不同写法
<触发器作用> 当在SQL.MySQL数据库中一张表中插入一条记录时,触动触发器,使同一数据库的另一张表插入相同记录. 在学习的过程中,发现两者的写法是不同的. <触发器作用> 1.在SQL中建立两张表sql_test,sql_tem.(两张表的字段是一样的) 复制代码 代码如下: create table sql_test ( id int, name varchar(16) ) create table sql_tem ( id int, name varchar(16) )
-
SQL JOIN 连接详细介绍及简单使用实例
SQL JOIN 连接 SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN). SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行. 让我们看看选自 "Orders" 表的数据: OrderID CustomerID OrderDate 10308 2 1996-09-18 10309 37 1996-09-19 10310 77 1996-09-20 然后
-
SQL SERVER中各类触发器的完整语法及参数说明
语法: Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE
-
MySQL中触发器入门简单实例与介绍
创建触发器.创建触发器语法如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中trigger_name标识触发器名称,用户自行指定: trigger_time标识触发时机,用before和after替换: trigger_event标识触发事件,用insert,update和delete替换: tbl_name标识建立触发器的表名,即在哪张表上建立触发
-
简单学习SQL的各种连接Join
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN).SQL LEFT JOIN.SQL RIGHT JOIN.SQL FULL JOIN,其中前一种是内连接,后三种是外链接. 假设我们有两张表,Table A是左边的表,Table B是右边的表. id name 1 Google 2 淘宝 3 微博 4 Facebook id address 1 美国 5 中国 3 中国 6 美国 IN
随机推荐
- 用VBS写的VBSCRIPT代码格式化工具VbsBeautifier
- OAuth认证协议中的HMACSHA1加密算法(实例)
- Eclipse开发Hibernate应用程序
- fckeditor的漏洞详细篇
- IIS服务器同时设置多个网站的三种方式(图文)
- 从别人那拷下来的几点Session使用的经验
- ie 处理 gif动画 的onload 事件的一个 bug
- JavaScript中的标签语句用法分析
- PHP与C#分别格式化文件大小的代码
- Python解析excel文件存入sqlite数据库的方法
- 详解链接的rel与target区别
- Sql Server中的非聚集索引详细介
- iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南
- ssh远程登陆没有用户名和主机名的解决方法
- DHCP:解析开发板上动态获取ip的2种实现方法详解
- 深入浅析Android JSON解析
- 分析Android多主题颜色的相关问题
- 利用python爬取斗鱼app中照片方法实例
- Java实现XML文件学生通讯录
- java求余的技巧汇总