SQL Server 触发器

触发器是一种特殊的存储过程,只有当试图用数据操作语言DML来修改数据时才会触发,DML包含对视图和表的增、删、改。

触发器分为DML触发器和DDL触发器,其中DML触发器会对数据表,视图进行insert、update、delete的时候触发。DDL则是create、alter、drop等时触发。

DML触发器又分为after(之后触发)和insert of(之前触发)触发器。

如果在创建触发器的时候不指定类型,则默认是after触发器。

触发器有两个虚拟的临时表:插入表(inserted)和删除表(deleted),由系统在内存中创建,不会保存到数据库。并且两张表都是只读的。当触发器完成工作后,这两张表会自动删除。

增加:inserted表 记录

删除:deleted表  记录

修改:inserted表记录修改前 deleted表记录修改后

修改数据时现删掉该记录,然后再增加一天新的记录。这样inserted和updated就都存在记录了。

触发器本身就是一个事务,可以利用事务的回滚,撤销操作。事务就是要么都执行,要么一条都不执行。

创建触发器

语法:

  1. create trigger [shema_name . ] trg_name
  2. on { table | view }
  3. [ with encryption ]
  4. { for | after | instead of }
  5. { insert , update , delete }
  6. as
  7. sql_statement

创建insert触发器

  1. if(object_id('tgr_test_insert','tr') is not null)
  2. drop trigger tgr_test_insert --删除触发器
  3. go
  4. create trigger tgr_test_insert
  5. on student --创建在student
  6. for insert --insert触发
  7. as
  8. declare @id int,@name varchar(20),@sex char(2),@age int
  9. --查询inserted表中已经插入的信息
  10. select @id = id,@name = name,@sex = sex, @age = age from inserted
  11. --用查到的信息加入到会员表中
  12. if(@age >30) --如果年龄不符合 则修改
  13. begin
  14. update student set age = 30 where id = @id
  15. print '年龄太大,已自动修改为30'
  16. end
  17. insert into [user] (userName,passWord,RoleId) values (@name,@sex + cast(@age as varchar),3)
  18. print '添加学生成功!';
  19. print '添加会员成功!'

对student表创建触发器后对该表执行insert后

  1. insert into student (name,sex,age,mail) values ('海盗船长','男',88,'853020304@qq.com')

查看运行结果

创建update触发器

  1. if(object_id('tgr_student_update','tr') is not null)
  2. drop trigger tgr_student_update
  3. go
  4. create trigger tgr_student_update
  5. on student
  6. for update
  7. as
  8. declare @oldName varchar(10),@newName varchar(10)
  9. select @oldName = name from deleted; --查找更新前的数据
  10. select @newName = name from inserted;--查找更新后的数据
  11. if(@oldName = @newName)
  12. begin
  13. print '数据相同'
  14. rollback tran; --回滚 不执行修改操作
  15. end
  16. else
  17. print '修改成功'
  1. update student set name='海盗船长'

事务在触发器中结束。批处理已中止。

  1. update student set name='粉红娘娘'

修改成功

创建delete触发器

  1. if(object_id('tgr_student_delete','tr')is not null)
  2. drop trigger tgr_student_delete
  3. go
  4. create trigger tgr_student_delete
  5. on student
  6. for delete
  7. as
  8. if(exists(select * from sys.databases where name = 'studentBackup'))
  9. insert into studentBackup select name,sex,age,mail from deleted;
  10. else
  11. print '不存在,创建再插入'
  12. create table studentBackup
  13. (
  14. name varchar(20),
  15. sex char(2),
  16. age int,
  17. mail varchar(20)
  18. )
  19. insert into studentBackup select name,sex,age,mail from deleted;
  1. delete from student
  2.  
  3. select * from student
  4. select * from studentBackup

创建instead of触发器

  1. if(object_id('tgr_student_inteadof','tr') is not null)
  2. drop trigger tgr_student_inteadof
  3. go
  4. create trigger tgr_student_inteadof
  5. on student
  6. instead of delete -- update , insert
  7. as
  8. declare @id int,@name varchar(20)
  9. select @id = id,@name = name from deleted;
  10. --instead of 先触发
  11. --先删除user表信息
  12. delete from [user] where userName = @name;
  13. --再删除student表信息
  14. delete from [student] where id = @id;
  15.  
  16. delete from student where name = '海盗船长'

修改触发器

  1. alter trigger tgr_test_insert
  2. on student
  3. for insert
  4. as
  5. print 'ok'

禁用触发器

  1. disable trigger tgr_test_insert on student

启用触发器

  1. enable trigger tgr_test_insert on student

查询已创建的触发器

  1. select * from sys.triggers

 

15、SQL Server 触发器的更多相关文章

  1. sql server触发器的例子

    发布:thebaby   来源:脚本学堂     [大 中 小] 本文介绍下,在sql server数据库中使用触发器的简单例子,有需要的朋友可以参考下,希望对你有一定的帮助. 原文地址:http:/ ...

  2. (转)SQL Server 触发器

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

  3. 自己写的sql server触发器练练--高手请您跳过吧

    set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER TRIGGER [insertReplyToic] ON [dbo].[bbsReplyTopic] ...

  4. sql server 触发器详细应用

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

  5. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  6. 在Sql Server触发器中判断操作是Insert还是Update还是Delete

    在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE    @IsInsert bit,    @IsUpdate bit,    @IsDelete  ...

  7. 喜忧参半的SQL Server触发器

    SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...

  8. SQL Server 触发器创建、删除、修改、查看示例

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

  9. SQL Server触发器

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

随机推荐

  1. C#事件(Event)学习日记

    event 关键字的来由,为了简化自定义方法的构建来为委托调用列表增加和删除方法. 在编译器处理 event 关键字的时候,它会自动提供注册和注销方法以及任何必要的委托类型成员变量. 这些委托成员变量 ...

  2. SVN ignores

    在windows下面用SVN 用命令行不是很方便,dos很烦的,所以一般都会用tourist svn mac下牛人都喜欢直接敲命令行,比如svn co http:// 等等.. 不过为了看得清楚,有必 ...

  3. DUILIB创建不规则窗体,自定义控件(很不错的几十篇文章)

    http://blog.csdn.net/harvic880925/article/details/8925650 http://blog.csdn.net/harvic880925/article/ ...

  4. VARCHAR2字段关联

    SQL> create table a1(id int,name varchar2(10)); Table created. SQL> create table a2(id int,nam ...

  5. checkbox操作

    小小示例:自己备份顺便粘出来共享. 引入头部文件:<script src="../js/jQuery1.7.2.js"></script> HTML代码: ...

  6. [git] git 分支( branch ) 的基本使用

    分支( branches ) 是指在开发主线中分离出来,做进一步开发而不影响到原来主线. Git 存储的不是一系列的更改集( changeset ),而是一系列快照.当你执行一次 commit 时, ...

  7. Cows - POJ 3348(凸包求面积)

    题目大意:利用n棵树当木桩修建牛圈,知道每头牛需要50平的生存空间,求最多能放养多少头牛. 分析:赤裸裸的求凸包然后计算凸包的面积. 代码如下: --------------------------- ...

  8. Domino - SGU 101 (欧拉路径)

    题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’), ...

  9. hdu 1010 dfs搜索

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. Ehcache专栏

    http://www.iteye.com/blogs/subjects/ehcache