SQL2008触发器

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

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

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

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表中删除的内容,并把这些内容拼接到一个变量中,用于记录成一个日志。

时间: 2024-10-12 20:12:31

SQL2008触发器的相关文章

SQL2008知识回顾

SQL2008 一.安装注意事项: 1.修改用户权限(在一个安装页面中有七八个)(改成net.) 2.添加当前系统用户为账户 二.主键,约束,索引 三.增删改查: insert.delete.update select__*或者列名_____from 表where_______排序分组 逐条核对,符合条件的显示出来 语句执行过程: 先找到表,筛选行结束,排序,筛选列 首先执行“from表”,最后执行select_______. 聚合函数:最终查询的结果集,进行聚合操作.位于select和from

【转】sql2008破解加密存储过程 (亲测可用)

网上的很多不能正确解密,出现空白,还好有这个,mark下了. Create PROCEDURE [dbo].[sp_windbidecrypt]  (@procedure sysname = NULL, @revfl int = 1)  AS /*********************************************************** 原作者:王成辉翻译整理 连接sqlcmd语法: sqlcmd -A -d databasename -o c:\a.txt 调用形式为

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

环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[zgccgc] //存储过程的名字 @zgID nvarchar(10),    //定义参数区@zgname nvarchar(10),@zgage  int,@zgaddress nvarchar(200) ASBEGIN    insert into

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Mysql中的触发器

阅读目录 什么是触发器 特点及作用 例子:创建触发器,记录表的增.删.改操作记录 弊端 什么是触发器 简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行: 特点及作用 特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行: 作用:保证数据的完整性,起到约束的作用: 例子:创建触发器,记录表的增.删.改操作记录 接下来将创建user和user_history表,以及三个触发器tri_insert_u

oracle(sql)基础篇系列(五)&mdash;&mdash;PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

information_schema系列五(表,触发器,视图,存储过程和函数)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表的信息,其中包括系统数据库和用户创建的数据库.而TABLESPACES 却是标注的活跃表空间. 看一下TABLES 的记录关于TEST1表: 其实我们通过show table status like 'test1'\G;可以看到相同的信息. TABLE_TYPE这列有两种类型,分别是BASE TAB

触发器和存储过程

触发器和存储过程   1.触发器   在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器.   触发器与永久性表关联,只能建在永久性表上面,不能是temporary表或view,且只有insert,update,delete三种事件.   mysql -u root -paixocm   show triggers;   show triggers\G;mysql> delimiter // ====改结束符   自动在内存

oracle 触发器

触发器--启动触发器alter trigger schema_trigger enable;--禁用触发器alter trigger schema_trigger disable;--删除触发器DROP TRIGGER COMPONT_GIS_TEM; 这个触发器是为了增加部件时,同步更新部件的缓存表,缓存表是为了在拿gis数据时,不用再联表查询街道.社区.大类的名称了缓存表中的sequence是  COMPONT_GIS_TEM_SEQ加入触发器的语句是CREATE OR REPLACE TR