最近第一次接触触发器,感觉很是新奇,也很是蛋疼,因为老板要求的是在触发器中获取用户信息,并把对表的操作进行记录,后者实现到时比较简单,前者确实让我纠结了好久,其实百度了一下关于SQL2008触发器的文章还是挺多的,写的好的也有好几篇,不过我觉得还是要根据自己的理解再给广大网友分享一下,从初识、理解、到最后的使用。

首先来看一下触发器的语法:

USE [数据库名]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
创建或修改(CREATE|ALTER) TRIGGER 触发器名(最好以XXXX_TR命名规范结尾)
ON
表名
FOR 对于什么操作触发(Insert,Update,Delete )
AS
BEGIN
触发后要做的操作
end

讲到触发器,当然少不了要提一下Inserted和Deleted表,

Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:

           虚拟表Inserted                     虚拟表Deleted

在表记录新增时       存放新增的记录                         不存储记录

修改时              存放用来更新的新记录                   存放更新前的记录

删除时              不存储记录                             存放被删除的记录

一个Insert 的过程可以看作为:生成的记录到Inserted表,

一个Delete的过程可以看作为:生成的记录到Deleted表,

一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表

这两个表在触发器中很是重要,一定要理解和区分 他们的关系和作用!

这两个表的结构和触发器对应的表结构是相同的!

在贴出我的关于删除触发的触发器实例供大家参考:

 USE [pd]
GO
/****** Object: Trigger [dbo].[table_delete] Script Date: 06/10/2014 09:39:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create TRIGGER [dbo].[DayRunRecord20140528_delete]
ON [dbo].[DayRunRecord20140528]
after delete
AS
if @@rowcount = 0 --如果影响的行数为 0,则结束触发器运行,避免占用资源
begin
return
end
else
BEGIN
SET NOCOUNT ON;
DECLARE @OperateDate datetime;
DECLARE @IPAddreass VARCHAR(20);
DECLARE @HostName varchar(50);
DECLARE @loginame varchar(50);
DECLARE @content varchar(5000)
DECLARE @content_temp varchar(2000)
DECLARE @OperateTable varchar(50);
--获取用户新增内容(人员定位表的字段)
DECLARE @ID int;
DECLARE @MineNumber int;
DECLARE @PepoleNumber int;
DECLARE @RouteStation varchar(10);
DECLARE @RouteTime datetime;
DECLARE @DataFlag int;
DECLARE @Remark1 char(50);
DECLARE @WorkNumber varchar(50);
DECLARE @ReceiveTime datetime;
DECLARE @EnterFlag int;
DECLARE @PowerFlag int;
DECLARE @DeviceDbId int;
DECLARE @TR_LastUpdateTime datetime;
DECLARE @TR_GUID uniqueidentifier;
set @content = '';
--声明游标
declare myCursor Cursor for
SELECT * from deleted
open myCursor
fetch next from myCursor into @ID,@MineNumber,@PepoleNumber,@RouteStation,@RouteTime,@DataFlag,@Remark1,@WorkNumber,@ReceiveTime,@EnterFlag,@PowerFlag,@DeviceDbId,@TR_LastUpdateTime,@TR_GUID
WHILE (@@FETCH_STATUS = 0)
BEGIN
set @content_temp = 'ID='+Convert(varchar,@ID) +
';MineNumber='+Convert(varchar,@MineNumber)+
';PepoleNumber='+Convert(varchar,@PepoleNumber)+
';RouteStation='+ @RouteStation +
';RouteTime='+Convert(varchar,@RouteTime)+
';DataFlag='+Convert(varchar,@DataFlag)+
';Remark1='+Convert(varchar,@Remark1) +
';WorkNumber='+@WorkNumber+
';ReceiveTime'+Convert(varchar,@ReceiveTime)+
';EnterFlag='+Convert(varchar,@EnterFlag)+
';PowerFlag='+Convert(varchar,@PowerFlag)+
';DeviceDbId='+Convert(varchar,@DeviceDbId)+
';TR_LastUpdateTime='+Convert(varchar,@TR_LastUpdateTime)+
';TR_GUID='+CONVERT(varchar(36),@TR_GUID);
if(@content<>'')
begin
set @content = @content + '&' +@content_temp ;
end
else
begin
set @content = @content_temp ;
end
--将游标下移
FETCH NEXT FROM myCursor into @ID,@MineNumber,@PepoleNumber,@RouteStation,@RouteTime,@DataFlag,@Remark1,@WorkNumber,@ReceiveTime,@EnterFlag,@PowerFlag,@DeviceDbId,@TR_LastUpdateTime,@TR_GUID
END
--关闭游标
CLOSE myCursor
--释放游标
DEALLOCATE myCursor
set @OperateTable = 'DayRunRecord20140528';
set @IPAddreass = convert(varchar,CONNECTIONPROPERTY('client_net_address'));
set @HostName = CONVERT(varchar,HOST_NAME());
set @OperateDate = GETDATE();
set @loginame = CONVERT(varchar,(select system_user));
--为日志表添加数据
insert into XJK_USER_OperateLog(OperateType,OperateTable,OperateContent,OperateDate,IPAddreass,HostName,UserName)
values('删除',@OperateTable,@content,@OperateDate,@IPAddreass,@HostName,@loginame);
END

其实代码虽然多,里面实现的功能却很简单,就是遍历Deleted表中删除的内容,并把这些内容拼接到一个变量中,用于记录成一个日志。

SQL2008触发器的更多相关文章

  1. 捕获Insert触发器失败记录

    1.背景 环境:发布服务器A Windows2008+SQL2008,分发服务器B Windows2008+SQL2008,订阅服务器C Windows2008+SQL2012发布服务器A上的用户信息 ...

  2. SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数

    环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCRE ...

  3. SQL触发器批量删除数据库中的表

    以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...

  4. sql2008破解加密存储过程

    网上的很多不能正确解密,出现空白,还好有这个,mark下了. Create PROCEDURE [dbo].[sp_windbidecrypt] (@procedure sysname = NULL, ...

  5. 【读后感1】SQL2008技术内幕- SQL逻辑查询处理

    引言观点 1. 编程语言日新月异,但是从没有人否定sql 在现代编程中的巨大作用和 持续的可利用性.SQL以对人类友好的阅读体验提供数据查询能力( 相比其他编程语言 ), 同时在各种数据库平台中,基础 ...

  6. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  7. pt-online-schema-change中update触发器的bug

    pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...

  8. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  9. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

随机推荐

  1. vue 实现分转元的 过滤器

    1.啥也不说了直接上代码吧  使用起来超方便 Vue.filter('amount', function (number) { // var number = +val.replace(/[^\d.] ...

  2. [转载]Ubuntu17.04(Zesty Zapus)路线图发布:2017年4月13日发布

    Canonical今天公布了Ubuntu 17.04(Zesty Zapus)操作系统的发布路线图,该版本于今年10月24日上线启动,toolchain已经上传且首个daily ISO镜像已经生成.面 ...

  3. php程序员绝不能违背的安全铁则

    作为PHP程序员,特别是新手,对于互联网的险恶总是知道的太少,对于外部的入侵有很多时候是素手无策的,他们根本不知道黑客是如何入侵的.提交入侵.上传漏洞.sql 注入.跨脚本攻击等等.作为最基本的防范你 ...

  4. 错误 You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work

    Win  10    下python3.6 使用Beautiful Soup  4错误 You are trying to run the Python 2 version of Beautiful ...

  5. My Baits入门(一)mybaits环境搭建

    1)在工程下引入mybatis-3.4.1.jar包,再引入数据库(mysql,mssql..)包. 2)在src下新建一个配置文件conf.xml <?xml version="1. ...

  6. Spring

    Spring 一个支持DI/IOC和AOP的开源容器框架 特点 DI/IOC DI 依赖注入(组件以特定方式接收来自容器的资源注入) IOC 控制反转(反转资源获取的方向) AOP 面向切面编程 开发 ...

  7. [转]初探Metasploit的自动攻击

    1. 科普Metasploit   以前只是个Back Track操作系统(简称:BT) 下的攻击框架,自成继承了后攻击渗透模块,隐隐有成为攻击平台的趋势. 我们都戏称它为美少妇,很简单,msf. 它 ...

  8. ZOJ-1239 Hanoi Tower Troubles Again!

    链接:ZOJ1239 Hanoi Tower Troubles Again! Description People stopped moving discs from peg to peg after ...

  9. debian的版本演进

    debian有三个发行版本,stable版.testing版和unstable版. 其中,unstable版本是开发者正在开发的版本,它里面保存着debian的开发者当前的工作.这个版本是不断在被更新 ...

  10. 【001:go语言的一些语法基础】

    1. 循环语句 Go只有for一个循环语句关键字,但支持3种形式 初始化和步进表达式可以是多个值 条件语句每次循环都会被重新检查,因此不建议在条件语句中 使用函数,尽量提前计算好条件并以变量或常量代替 ...