一、创建一个简单的触发器
CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
    T-SQL 语句
注意:触发器名称是不加引号的。
 
二、删除触发器
drop trigger 触发器名称
删除多个触发器:drop trigger 触发器名称,触发器名称
 
三、重命名触发器
用查询分析器重命名
exec sp_rename 原名称, 新名称
sp_rename 是 SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。
 
四、INSERT、UPDATE 或 DELETE
 
INSTEAD OF
执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
create trigger f
on tbl
instead of delete
as
    insert into Logs...
 
IF UPDATE(列名)
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
on tbl
for update
as
    if update(status) or update(title)
        sql_statement --更新了 status 或 title 列
 
inserted、deleted
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
    declare @title varchar(200)
    select @title=title from deleted
    insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')
说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。
 
五、查看数据库中所有的触发器
use 数据库名
go
select * from sysobjects where xtype='TR'
sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。
 
六、sp_helptext 查看触发器内容
 
use 数据库名
go
exec sp_helptext '触发器名称'
 
七、sp_helptrigger 用于查看触发器的属性
sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。
 
例:
 
use 数据库名
go
exec sp_helptrigger tbl
 
八、递归、嵌套触发器
递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。
 
间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1...
直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1... 
嵌套触发器
 
类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1->T2->T3...这样一直触发下去,最多允许嵌套 32 层。
 
设置直接递归
 
默认情况下是禁止直接递归的,要设置为允许有两种方法:
 
T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
EM:数据库上点右键->属性->选项。 
设置间接递归、嵌套
 
默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:
 
T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许
EM:注册上点右键->属性->服务器设置。 
 
九、触发器回滚
我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。
 
use 数据库名
go
create trigger tr
on 表名
for update
as
    if update(userName)
        rollback tran
 
关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。
 
十、禁用、启用触发器
禁用:alter table 表名 disable trigger 触发器名称
启用:alter table 表名 enable trigger 触发器名称
 
如果有多个触发器,则各个触发器名称之间用英文逗号隔开。
 
如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。
 
十一、判断插入修改删除
create TRIGGER [updatetest] ON [dbo].[TEST]
FOR INSERT, UPDATE, DELETE
AS
begin
DECLARE
@IsInsert bit,
@IsUpdate bit,
@IsDelete bit
IF EXISTS(SELECT FROM inserted) AND NOT EXISTS(SELECT FROM deleted)
SET @IsInsert =
ELSE
SET @IsInsert = IF EXISTS(SELECT FROM inserted) AND EXISTS(SELECT FROM deleted)
SET @IsUpdate =
ELSE
SET @IsUpdate = IF NOT EXISTS(SELECT FROM inserted) AND EXISTS(SELECT FROM deleted)
SET @IsDelete =
ELSE
SET @IsDelete = if (@IsUpdate=)
PRINT 'updated '
if (@IsInsert=)
PRINT 'insert '
if (@IsDelete=)
PRINT 'delete '
end

SQL触发器 常用语句的更多相关文章

  1. SQL server 常用语句

    SQL Server中常用的SQL语句   1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10. ...

  2. SQL Server常用语句

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. sql数据库常用语句总结

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  4. SQL的常用语句

    select * from g_members where id between '16' and '31' order by id desc 倒序排列 select * from g_members ...

  5. Sql sever 常用语句(续)

    distintct:  查询结果排除了重复项(合并算一项)--如查姓名 select distinct ReaName from  UserInfo 分页语句:(查询区间时候应该查询出行号,作为分页的 ...

  6. [SQL]数据库常用语句

    1.使用旧表创建新表 SELECT * INTO CC FROM AA ; (适用于版本SQL SERVER)

  7. SQL注入常用语句

    整形参数判断     1.直接加'  2.and 1=1  3. and 1=2     如果1.3运行异常 2正常就存在注入 字符型判断     1.直接加'  2.and '1'='1'  3. ...

  8. sql 操作表常用语句,语法

    新增列:alter table 表名 add 新列名 数据类型 删除列:alter table 表名 drop column 列名 删除约束:alter table 表名 drop constrain ...

  9. sql server常用函数、常用语句

    一.常用函数 1.字符串函数 : charindex(':','abc:123')    --寻找一个字符在一段字符串中起始的位置 len('zhangsan')   --获取一段字符串的长度 lef ...

随机推荐

  1. I/O Mutiplexing poll 和 epoll

    上一篇介绍了select的基本用法,接着来学习一下poll和epoll的基本用法.首先来看poll: #include <sys/poll.h> int poll (struct poll ...

  2. Mac WIn7 QQ聊天记录互导 聊天记录合并

    也许等哪天老了回过头来看看.说不定还有一丝欢乐. 有几个方法可以实现 一.dropbox数据同步 二.QQ会员 三.下面方法 1.因为现在的Mac QQ还不支持聊天记录的导入导出.所以只能手动了 如果 ...

  3. iOS开发 - Core Animation 核心动画

    Core Animation Core Animation.中文翻译为核心动画,它是一组很强大的动画处理API,使用它能做出很炫丽的动画效果.并且往往是事半功倍. 也就是说,使用少量的代码就能够实现很 ...

  4. VB6 获取和设置默认打印机

    Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA&quo ...

  5. 透彻理解Ioc

    引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不 ...

  6. 写一个function,清除字符串前后的空格。(兼容所有浏览器)

    代码: function trim(str) { if (str && typeof str === "string") { return str.replace( ...

  7. JVM的结构

    参考:http://blog.csdn.net/tonytfjing/article/details/44278233 JVM的结构 一般认为,JVM分为四大部分:     1.类加载器(ClassL ...

  8. Configuring the launch of the remote virtual machine to debug

    Options need to be added to the standard launch of a virtual machine (VM) to enable the debugging ar ...

  9. dubbo应用架构演进路线图

    1.单应用单服务器: 2.单应用拆分成多个应用并部署到多个服务器: 3.单应用拆分成多个应用并实现分布式部署: 4.流动计算框架(用于提高机器利用率的资源调度和治理中心).

  10. django 生成csv文件重要代码

    import csv from django.http import HttpResponse # Number of unruly passengers each year 1995 - 2005. ...