SQL2008触发器
最近第一次接触触发器,感觉很是新奇,也很是蛋疼,因为老板要求的是在触发器中获取用户信息,并把对表的操作进行记录,后者实现到时比较简单,前者确实让我纠结了好久,其实百度了一下关于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表
这两个表在触发器中很是重要,一定要理解和区分 他们的关系和作用!
这两个表的结构和触发器对应的表结构是相同的!
在贴出我的关于删除触发的触发器实例供大家参考:
1 USE [pd] 2 GO 3 /****** Object: Trigger [dbo].[table_delete] Script Date: 06/10/2014 09:39:20 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 create TRIGGER [dbo].[DayRunRecord20140528_delete] 9 ON [dbo].[DayRunRecord20140528] 10 after delete 11 AS 12 if @@rowcount = 0 --如果影响的行数为 0,则结束触发器运行,避免占用资源 13 begin 14 return 15 end 16 else 17 BEGIN 18 SET NOCOUNT ON; 19 DECLARE @OperateDate datetime; 20 DECLARE @IPAddreass VARCHAR(20); 21 DECLARE @HostName varchar(50); 22 DECLARE @loginame varchar(50); 23 DECLARE @content varchar(5000) 24 DECLARE @content_temp varchar(2000) 25 DECLARE @OperateTable varchar(50); 26 --获取用户新增内容(人员定位表的字段) 27 DECLARE @ID int; 28 DECLARE @MineNumber int; 29 DECLARE @PepoleNumber int; 30 DECLARE @RouteStation varchar(10); 31 DECLARE @RouteTime datetime; 32 DECLARE @DataFlag int; 33 DECLARE @Remark1 char(50); 34 DECLARE @WorkNumber varchar(50); 35 DECLARE @ReceiveTime datetime; 36 DECLARE @EnterFlag int; 37 DECLARE @PowerFlag int; 38 DECLARE @DeviceDbId int; 39 DECLARE @TR_LastUpdateTime datetime; 40 DECLARE @TR_GUID uniqueidentifier; 41 set @content = ''; 42 --声明游标 43 declare myCursor Cursor for 44 SELECT * from deleted 45 open myCursor 46 fetch next from myCursor into @ID,@MineNumber,@PepoleNumber,@RouteStation,@RouteTime,@DataFlag,@Remark1,@WorkNumber,@ReceiveTime,@EnterFlag,@PowerFlag,@DeviceDbId,@TR_LastUpdateTime,@TR_GUID 47 WHILE (@@FETCH_STATUS = 0) 48 BEGIN 49 set @content_temp = 'ID='+Convert(varchar,@ID) + 50 ';MineNumber='+Convert(varchar,@MineNumber)+ 51 ';PepoleNumber='+Convert(varchar,@PepoleNumber)+ 52 ';RouteStation='+ @RouteStation + 53 ';RouteTime='+Convert(varchar,@RouteTime)+ 54 ';DataFlag='+Convert(varchar,@DataFlag)+ 55 ';Remark1='+Convert(varchar,@Remark1) + 56 ';WorkNumber='+@WorkNumber+ 57 ';ReceiveTime'+Convert(varchar,@ReceiveTime)+ 58 ';EnterFlag='+Convert(varchar,@EnterFlag)+ 59 ';PowerFlag='+Convert(varchar,@PowerFlag)+ 60 ';DeviceDbId='+Convert(varchar,@DeviceDbId)+ 61 ';TR_LastUpdateTime='+Convert(varchar,@TR_LastUpdateTime)+ 62 ';TR_GUID='+CONVERT(varchar(36),@TR_GUID); 63 if(@content<>'') 64 begin 65 set @content = @content + '&' +@content_temp ; 66 end 67 else 68 begin 69 set @content = @content_temp ; 70 end 71 --将游标下移 72 FETCH NEXT FROM myCursor into @ID,@MineNumber,@PepoleNumber,@RouteStation,@RouteTime,@DataFlag,@Remark1,@WorkNumber,@ReceiveTime,@EnterFlag,@PowerFlag,@DeviceDbId,@TR_LastUpdateTime,@TR_GUID 73 END 74 --关闭游标 75 CLOSE myCursor 76 --释放游标 77 DEALLOCATE myCursor 78 set @OperateTable = 'DayRunRecord20140528'; 79 set @IPAddreass = convert(varchar,CONNECTIONPROPERTY('client_net_address')); 80 set @HostName = CONVERT(varchar,HOST_NAME()); 81 set @OperateDate = GETDATE(); 82 set @loginame = CONVERT(varchar,(select system_user)); 83 --为日志表添加数据 84 insert into XJK_USER_OperateLog(OperateType,OperateTable,OperateContent,OperateDate,IPAddreass,HostName,UserName) 85 values('删除',@OperateTable,@content,@OperateDate,@IPAddreass,@HostName,@loginame); 86 END
其实代码虽然多,里面实现的功能却很简单,就是遍历Deleted表中删除的内容,并把这些内容拼接到一个变量中,用于记录成一个日志。
转载于:https://www.cnblogs.com/Lixinhua-GoOn/p/3779754.html
SQL2008触发器相关推荐
- SQL server 如何建立两个表的关系
原文地址::https://jingyan.baidu.com/article/0f5fb0993342106d8334ea8e.html 相关文章 1.两个数据库表数据实时同步(sql2008 触发 ...
- SQL2008,SQL2005存储过程解密
下载:附件 SQL2008,SQL2005存储过程解密 第一步操作步骤:'程序'->'Sql Server2005'-> '配置工具'-> 'Sql Server 外围应用配置器'- ...
- SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击"存储过程"-点击"新建存储过程" SET ANSI_NULLS ON GO SET QUO ...
- 【转】【亲测】sql2008破解加密存储过程 (亲测可用)
网上的很多不能正确解密,出现空白,还好有这个,mark下了. Create PROCEDURE [dbo].[sp_windbidecrypt] (@procedure sysname = NULL ...
- MySQL 学习笔记(8)— 触发器
1. 触发器概念 触发器是 MySQL 响应以下任意语句而自动执行的一条 MySQL 语句(或位于BEGIN 和 END 语句之间的一组语句) INSERT UPDATE DELETE 其他 MySQ ...
- sql2000 转sql2008
1,在sql2008服务器上新建空数据库,与sql2000同名,当然可以不同名. 2,在sql2008服务器上选择数据库,点右键,任务-导入数据.打开导入数据向导. 3,点击下一步,选择数据源.数据源 ...
- Oracle 触发器 Update 不能操作本表的疑问
今天要解决一个需求,类似表A有个字段叫flag存储的是0 or 1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...
- SQL SERVER 触发器示例
触发器是一种特殊的存储过程. 触发器语法 : CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | A ...
- mysql触发器菜鸟_mysql触发器学习
创建一个触发器 语法:create trigger 触发器名字create trigger xiaoshou_update_trigger after update on xiaoshou for e ...
- 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
[Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...
最新文章
- Python,OpenCV使用KNN来构建手写数字及字母识别OCR
- OAF页面查找数据源
- CCTYPE函数系列
- 空值替换为0_「Excel」是零值还是空值,你可以自由掌控
- C、C++ 宽字符WCString转为char*
- 前端学习(3267):js中this的指向二
- 程序员面试金典 - 面试题 02.06. 回文链表(快慢指针+链表反转)
- mysql5.5编译安装脚本_mysql5.5 免编译安装及脚本启动报错深入
- twig php代碼,有没有办法在wordpress的.twig文件中编写php代码?我试图使用.twig模板文件中的表单值发送邮件...
- 权威媒体、专家对新书的推荐
- 堪比ps:Affinity Photo for mac(专业修图软件)
- 计算机网络之A、B、C类网络地址
- 2020美赛MCM/ICM参赛及获奖分析
- oracle 优化方法总结
- 计算机cpu在哪,cpu什么意思啊_电脑cpu哪里看
- 家里两台电脑怎么共享文件_电脑系统教程:两台电脑如何共享文件
- word打开文档很久很慢_word打开慢,详细教您怎么解决word打开慢
- ajax怎么设置地图,通过数据库和ajax方法写出地图的实例代码
- OC语言学习——继承和多态的一些随笔记
- Java实现增删改查系统代码(全~纯干货)
热门文章
- 手机应用宝占用了8G
- python中的计时器timeit_python中的计时器:timeit
- @transactional 可以定义到controller_仿照源码,手写一个自定义 Spring MVC 框架
- linux ssl 脚本 51cto,升级opensslopenssh的shell脚本
- java captcha 验证码_java生成图片验证码的示例代码
- sh脚本异常:/bin/sh^M:bad interpreter: No such file ...
- mysql 有关的文件
- P3161 [CQOI2012]模拟工厂
- Four-tuples 山东省赛F题
- 以线虫为模型模拟的神经网络,让机器人无需训练即可自动避开障碍物