zoukankan      html  css  js  c++  java
  • 触发器使用

      触发器是一种特殊的存储过程,她不能被显示的调用,而是在对表增删改操作后被激活。所以可以用触发器对来实施复杂的完整性约束。

      SQL为每个触发器创建两个专用表:Inserted表和Deleted表。这两张表由系统来维护,她们存在内存中而不是在数据库中,触发完成后,相关的两个表也会被删除。

      

      AFTER 触发器和INSTEAD OF 触发器

      SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。

      INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。

      触发器的执行过程

      如果一个insert,update或delete语句违反了约束,那么after触发器不会被执行,因为对约束的检查是在after触发器执行之前发生的,所以after不能超越约束。

      instead of触发器可以取代激发她的操作来执行,她在inserted表和deleted 表刚被建立,其他操作还未发生时执行,因为inserted of 在约束检查前执行,所以可以对约束进行一些预处理。

      创建触发器语法

      CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
      { BEFORE AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。
      { INSERT UPDATE DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
      ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
      FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
      <触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。

      --你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。

      实例:

     1 create trigger tri_creatproject
     2 on dbo.ProjectRegister
     3 for insert  /*插入触发*/
     4 as 
     5 declare  @ID int ,@Name varchar(20),@type tinyint;  /* 变量定义*/
     6 select @ID = ID from inserted; /* 得到插入的数据ID*/
     7  /* 相关变量赋值*/
     8 set @ID = @ID + '40001'
     9 set @Name = '项目部';
    10 set @type = 1;
    11 insert into Supplier(ID,Name,[type]) values(@ID,@Name,@type); /*触发后插入另一张表*/
    12 go

      删除触发器

    drop trigger trigger_name

      查看已有触发器

    select * from sysobjects where xtype = 'tr'

      

      查看一个触发器

    exec sp_helptext 'trigger_name'
  • 相关阅读:
    获取程序的当前启动路径
    SuspendLayout,ResumeLayout,Layout,PerformLayout
    序列化反序列化的简单例子
    简单的异步编程入门例子
    ClickOnce的更新策略
    ubuntu update(国内升级源)
    为AptGet设置代理
    如何启用 Ubuntu 中的 root 帐号
    The Great Tunnel Debate: PBT vs TMPLS
    Traffic engineering for Ethernet: PBT vs. TMPLS
  • 原文地址:https://www.cnblogs.com/xiangzhong/p/2650451.html
Copyright © 2011-2022 走看看