参考了别人写的文章,我删除掉一些废话,只看一些我想看的信息。整理了一下,记录在这里,方便以后查阅!

  1.当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。
  2.当触发delete触发器后,从触发器表中删除的行将被保存到deleted表中。注意:deleted表和触发器表中没有相同的行。执行truncate table语句时触发器不会执行。
  3.当触发update触发器时,更新前的数据移入到deleted表,更新后数据被移入到inserted表。

一、使用例子

例子1:创建一个触发器,如果产品有订购历史,则回滚。

create trigger trig_DeleteProduct
on Products
for delete
as
if (select count(*) from [Order Details] as OD inner join deleted as D on OD.ProductID = D.ProductID) > 0
begin
raiserror('该产品已经有订购信息,不能被删除!',16,1)
rollback transaction
return
end

例子2:保证不能删除表中数据

create trigger trig_ProtectData
on TableName for delete
as
raiserror('不能删除改表中的数据',16,1,'提示')
rollback transaction
return

例子3:保证每次最多只能删除一个雇员

create trigger trig_DeleteEmployee
on Employees
for delete
as
if (select count(*) from deleted) > 1
begin
raiserror('一次不能删除多条数据!',16,1)
rollback transaction
return
end

例子4:监视指定列的数据更新

create trigger trig_UpdateEmployee
on Employees
for update
as
if update(FirstName)
begin
raiserror('FirstName不能更新!',16,1)
rollback transaction
return
end

例子5:更新时引起关联表某字段值的更新

ALTER TRIGGER [tr_UpdateStudent]
ON [dbo].[T_Student] FOR UPDATE
AS
DECLARE @updateI int
BEGIN
SELECT @updateI = TId FROM INSERTED; UPDATE dbo.T_Teacher SET XM='' WHERE Id=@updateI; END

以后发现有新的例子 继续添加在。。

二、触发器多一点了解

1、触发器的被动型

  被动型的意思是指触发器发生在事务之后。当激活触发器时,整个查询已经运行并且事务也已经被记录到日志中(但未提交,只是记录到激活触发器的语句点)。这意味着如果触发器需要回滚,那么必须撤销已经做的所有工作。这和约束是不同,约束是主动的,约束是发生在语句真正执行前。这意味着约束会检测可能失败的操作,并且在进程的前期就予以阻止。所以约束通常运行得快一些-在更为复杂的查询中速度更快。注意,只有在发生回滚时,约束明显更快。

  如果正在处理少量回滚,而且受影响的语句的复杂性较低,执行之间较短,那么触发器和约束之间没有太大的区别。但是在无法预知回滚的数量的时候,坚持使用约束的效率更好

2、使用IF UPDATE()和COLUMNS_UPDATE()

  UPDATE()函数只在触发器的作用域内适用。它唯一的目的是提供一个布尔值,来说明特殊列是否已经更新。

  COLUMNS_UPDATE()函数和UPDATE()的运行方式不同,但目的相同。COLUMNS_UPDATE()函数可以一次检查多列。为了实现这一点,该函数使用了位掩码。

  于上图的情况,数据的单个字节说明了第2,第3,以及第6列已经更新,而其他列没有更新。对于超过8列的情况,SQL Server就会在右边添加另一个字节并且继续计数。

对于上图,这次是跟心了第2,第9以及第14列。

  示例:

  COLUMN_UPDATE()>0  检查是否有列被更新。

  COLUMN_UPDATE()^21=0  检查是否更新了所有指定列(1、3、5)。

创建触发器如下:

  CREATE TRIGGER UPDATECHECK2
  ON tb_Money
  FOR UPDATE
  AS
  IF COLUMNS_UPDATED()&7 = 3 --如果同时更新了Name,MyMoney才触发
  BEGIN
  PRINT('我的钱和姓名改变了!');
  END

  执行语句以及说明如下:

  UPDATE tb_Money SET Name = '张飞' WHERE Id = 1

  UPDATE tb_Money SET Name = '赵云', MyMoney = 102 WHERE Id = 1    --此行会激活触发器
  --计算过程如下
  --Id Name tb_Money
  --1 1 1 7(全部更新为7)
  --0 1 1 Name和tb_Money同时更新为(与3=3)

MSSQLSERVER数据库- 触发器的更多相关文章

  1. MSSqlServer 数据库降级及数据转移

    --MSSqlServer数据库降级及数据转移--MS SQL SERVER高版本数据库(Database_A)恢复数据到低版本数据库(Database_B)中--1.数据库结构对象(包含表.视图.函 ...

  2. MS-sqlserver数据库2008如何转换成2000

    http://bbs.csdn.net/topics/390438560?page=1#post-394316973 MS-sqlserver数据库2008如何转换成2000 回你这个贴等于我写个博客 ...

  3. 数据库触发器new old

    数据库触发器new old: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . col ...

  4. sqlserver数据库触发器调用外部exe

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...

  5. Mysql数据库触发器调用脚本

    一.数据库触发器 mysql触发器trigger 实例详解 对数据库触发器new和old的理解 示例 二.UDF mySql的UDF是什么 三.安装执行命令UDF mysql触发器调用外部脚本(安装) ...

  6. 数据库级别DDL操作监控审计、数据库触发器/服务器触发器

    关键词:数据库触发器/服务器触发器  ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...

  7. Oracle12c中多宿主环境(CDB&PDB)的数据库触发器(Database Trigger)

    Oracle12c中可插拔数据库(PDBs)上的多宿主数据库触发器 随着多宿主选项的引入,数据库事件触发器可以在CDB和PDB范围内创建. 1.   触发器范围 为了在CDB中创建数据库事件触发器,需 ...

  8. mssqlserver 数据库一直提示“正在还原”

    今天访问服务器,突然发现不知道数据库被谁给还原了,而且一直处于还原状态无法结束. 通过查询说是恢复进程被挂起了,最终通过命令: RESTORE database   dbname with recov ...

  9. 对数据库触发器new和old的理解

    在数据库的触发器中经常会用到更新前的值和更新后的值,所有要理解new和old的作用很重要.当时我有个情况是这样的:我要插入一行数据,在行要去其他表中获得一个单价,然后和这行的数据进行相乘的到总金额,将 ...

随机推荐

  1. HDU1548——A strange lift(最短路径:dijkstra算法)

    A strange lift DescriptionThere is a strange lift.The lift can stop can at every floor as you want, ...

  2. [译]Atomic VS. Non-Atomic 操作

    原文链接:atomic-vs-non-atomic-operations 在网上已经写了很多关于原子操作的文章,但是通常都集中在原子的读-修改-写(RMW. read-modify-write)操作. ...

  3. poj1026Cipher(置换群)

    链接 找循环节 然后所有子循环节的最小公倍数就是总的循环节 找结果的时候也按一个个置换来进行转换 不然也TLE #include <iostream> #include<cstdio ...

  4. poj 1039 Pipe(叉乘。。。)

    题目:http://poj.org/problem?id=1039 题意:有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从 ...

  5. [原]Unity3D深入浅出 - 粒子系统(Particle System)

    粒子系统是在三维空间渲染出来的二维图像,主要用于烟,火,水滴,落叶等效果.一个粒子系统由粒子发射器.粒子动画器和粒子渲染器三个独立的部分组成. Unity中自带了一些粒子效果,在Assets>I ...

  6. Samba 安全漏洞

    漏洞名称: Samba 安全漏洞 CNNVD编号: CNNVD-201403-239 发布时间: 2014-03-17 更新时间: 2014-03-17 危害等级: 中危   漏洞类型: 信任管理 威 ...

  7. Web请求响应简单整理

      简单对Web请求响应如何处理进行的整理,难免有理解不到位,理解有偏差的地方,如有理解有误的地方,希望大牛批评指正. 1.Web开发的定义首先看看微软对Web开发的定义:Web开发是一个指代网页或网 ...

  8. c语言typedef关键字的理解

    1.typedef的定义 很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关.本来嘛,type 是数据类型的意思:def(ine)是定义的意思,合起来就是定义数据类型啦. 不过很遗憾 ...

  9. Java [Leetcode 40]Combination Sum II

    题目描述: Given a collection of candidate numbers (C) and a target number (T), find all unique combinati ...

  10. (三)学习JavaScript之getElementsByTagName方法

    参考:http://www.w3school.com.cn/jsref/met_doc_getelementsbytagname.asp HTML DOM Document 对象 定义和用法 getE ...