触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

什么是触发器?

触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行性该表上对应的触发器。SqlServer2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

DML触发器分为:

1、after触发器(之后触发)

a、insert触发器

b、update触发器

c、delete触发器

2、instead of 触发器 (之前触发)

其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

触发器有两个特殊的表:插入表(instered表)删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

对表的操作

Inserted逻辑表

Deleted逻辑表

增加记录(insert)

存放增加的记录

删除记录(delete)

存放被删除的记录

修改记录(update)

存放更新后的记录

存放更新前的记录

update数据的时候就是先删除表记录,然后增加一跳记录。这样在inserted和deleted表就都有update后的数据记录了。

注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

创建触发器

语法:

tgr_name
table_name
encrypion –加密触发器
... Transact-SQL
--创建insert插入类型触发器
(object_id(, ) )
tgr_classes_insert tgr_classes_insert
classes
insert --插入触发

# 创建insert类型触发器

 --定义变量
@id , @name (20), @temp ;
--在inserted表中查询已经插入记录信息
@id = id, @name = name inserted;
@name = @name + (, @id);
@temp = @id / 2;
insert student (@name, 18 + @id, @temp, @id);
; --插入数据
insert classes (, getDate());
--查询数据
* classes;
* student id;

insert触发器,会在inserted表中添加一条刚插入的记录。

# 创建delete类型触发器

--delete删除类型触发器
(object_id(, ) )
tgr_classes_delete tgr_classes_delete
classes
--删除触发 ;
(object_id(, ) )
--存在classesBackup,直接插入数据
insert classesBackup name, createDate deleted; --不存在classesBackup创建再插入
* classesBackup deleted;
; -- nocount ;
classes name = ;
--查询数据
* classes;
* classesBackup;

# 创建update类型触发器

--update更新类型触发器
(object_id(, ) )
tgr_classes_update tgr_classes_update
classes @oldName (20), @newName (20);
--更新前的数据
@oldName = name deleted;
( ( * student name + @oldName + )) --更新后的数据
@newName = name inserted;
student name = replace(name, @oldName, @newName) name + @oldName + ;
; ; --查询数据
* student id;
* classes;
classes name = name = ;

update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。

# update更新列级触发器

  (object_id(, )   )
tgr_classes_update_column tgr_classes_update_column
classes --列级触发器:是否更新了班级创建时间
((createDate)) (, 16, 11);
; --测试
* student id;
* classes;
classes createDate = getDate() id = 3;
classes name = id = 7;

更新列级触发器可以用update是否判断更新列记录;

# instead of类型触发器

nstead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容。

创建语法

  tgr_name
table_name
encryption
instead ... T-SQL

# 创建instead of触发器

 (object_id(, )   )
tgr_classes_inteadOf tgr_classes_inteadOf
classes
instead @id , @name (20);
--查询被删除的信息,病赋值
@id = id, @name = name deleted;
+ (, @id) + + @name;
--先删除student的信息
student cid = @id;
--再删除classes的信息
classes id = @id;
+ (, @id) + + @name + ; --test
* student id;
* classes;
classes id = 7;

# 显示自定义消息raiserror

 (object_id(, )   )
tgr_message tgr_message
student
insert,
(, 16, 10); --test
insert student (, 22, 1, 7);
student sex = 0 name = ;
* student id;

# 修改触发器

  tgr_message
student (, 16, 10); --test
student name = ;

# 启用、禁用触发器

--禁用触发器
disable tgr_message student;
--启用触发器
enable tgr_message student;

# 查询创建的触发器信息

--查询已存在的触发器
* sys.triggers;
* sys.objects type = ; --查看触发器触发事件
te.* sys.trigger_events te sys.triggers t
t.object_id = te.object_id
t.parent_class = 0 t.name = ; --查看创建触发器语句
sp_helptext ;

# 示例,验证插入数据

 ((object_id(, )   ))
tgr_valid_data tgr_valid_data
student
insert @age ,
@name (20);
@name = s.name, @age = s.age inserted s;
(@age < 18) (, 16, 1);
; --test
insert student (, 2, 0, 7);
insert student (, 22, 0, 7);
* student id;

# 示例,操作日志

 (object_id(, )   )
log log(
id (1, 1) ,
(20),
createDate datetime getDate()
) ( ( * sys.objects name = ))
tgr_student_log tgr_student_log
student
insert, , (( ( 1 inserted)) ( ( 1 deleted))) insert log() (); ( ( 1 inserted) ( 1 deleted)) insert log() (); ( ( 1 inserted) ( 1 deleted)) insert log() (); --test
insert student (, 22, 1, 7);
student sex = 0 name = ;
student name = ;
* log;
* student id;

sql 触发器,看完后对CHK有更深的理解的更多相关文章

  1. 从工厂流水线小妹到Google上班程序媛,看完后,我跪服了!

    阅读本文大概需要 10.2 分钟. 文作者:Ling Sun 原文链接:https://www.zhihu.com/question/68154951/answer/546265013 我家境很不好, ...

  2. iPhone不为人知的功能常用技巧,看完后才发现很多用iPhone的人实在是愧对乔布斯! - imsoft.cnblogs

    很多人花了四五千买部苹果,结果只用到四五百块钱的普通手机功能. iPhone不为人知的功能,常用技巧: 网上搜集整理的iPhone快捷键操作,虽然表面上iPhone按键只有一个HOME键,大部分操作都 ...

  3. spring ioc原理(看完后大家可以自己写一个spring)

    控制反转/依赖注入 最近,买了本Spring入门书:spring In Action .大致浏览了下感觉还不错.就是入门了点.Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专 ...

  4. (转)spring ioc原理(看完后大家可以自己写一个spring)

    最近,买了本Spring入门书:spring In Action .大致浏览了下感觉还不错.就是入门了点.Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning, ...

  5. (转)spring ioc原理(看完后大家可以自己写一个spring)

    原文地址:https://blog.csdn.net/it_man/article/details/4402245 最近,买了本Spring入门书:spring In Action .大致浏览了下感觉 ...

  6. 【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!

    写在前面 在<[String注解驱动开发]面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!>一文中,我们详细的介绍了BeanPostProcessor的执行流 ...

  7. 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!

    写在前面 之前,我们在<[高并发]高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!>一文中,详细讲解了高并发秒杀系统的架构设计,其中,我们介绍了可以使用Redis存储秒杀商品的库存数量.很 ...

  8. 保证看完就会!大数据YRAN核心知识点来袭!

    01 我们一起学大数据 大家好,今天分享的是大数据YRAN的核心知识点,老刘尽量用通俗易懂的话来讲述YARN知识点,争取做到大家看完后能够用口语化的形式将它们表达出来,做到真正的看完就会!(如果觉得老 ...

  9. 看完我的笔记不懂也会懂----bootstrap

    目录 Bootstrap笔记 知识点扫盲 容器 栅格系统 源码分析部分 外部容器 栅格系统(盒模型)设计的精妙之处 Bootstrap笔记 写在开始: 由于我对AngulaJS的学习只是一个最浅显的过 ...

随机推荐

  1. SAP文件的上传下载 SMW0,二进制文件

    TCODE: SMW0 选择:二进制数据 输入包名和对象名 新建 维护文件类型 文件参数信息 下载: DATA: LS_WWWDATA_ITEM LIKE WWWDATATAB, " LV_ ...

  2. win10 uwp 参考

    态度随意申请专栏,没想到通过 看了我的博客,都是在别的大神博客看到,然后修改他们的 我看到的大神博客 东邪独孤 http://www.cnblogs.com/tcjiaan/ 老周,买了他的<W ...

  3. 关于keyTyped

    蠢了,重写keyTyped方法时候拿keyCode去做比较....记一下....VK_UNDEFiEND.......

  4. Ajax禁止重复提交

    var pendingRequests = []; var generatePendingRequestKey = function (obj) { return obj.data || {}; } ...

  5. 在CUDA8.0下编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0(网上有 ...

  6. JAVA基础知识总结:八

    面向对象语言的三大特性;封装.继承.多态 一.面向对象语言特性之封装 1.什么是封装? 一个类中某些属性,如果不希望外界直接访问,我们可以将这个属性作为私有的,可以给外界暴露出来一个访问的方法 使用封 ...

  7. css左侧固定宽度,右侧自适应的几种实现方法

    左侧固定,右侧自适应或者右侧固定在,左侧自适应是一样的.这种布局很常见,而且面试过程中也经常会问到,这里我总结的方法一共有5种.要实现这种布局,也算比较简单.我们先给出html结构: <div ...

  8. #1094 : Lost in the City by C solution

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi gets lost in the city. He does not know where he is ...

  9. Pie

    Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...

  10. Leftmost Digit

    Problem Description Given a positive integer N, you should output the leftmost digit of N^N.   Input ...