您的位置:新葡亰496net > 网络数据库 > 触发器的分解

触发器的分解

发布时间:2019-11-15 13:01编辑:网络数据库浏览(81)

    最简易的乐趣就是在sql

    触发器(1)

     

    触发器(trigger)是个非常的积攒进度,它的试行不是由程序调用,亦不是手工业运行,而是由事件来触发,举个例子当对贰个表张开操作( insert,delete, update卡塔尔时就能激活它试行。触发器平常用来进步数据的完整性限定和事业法规等。 触发器能够从 DBA_TRIGGERS ,USER_T奥迪Q5IGGE中华VS 数据字典中查到。
      触发器与仓储进程的举世无双分化是触发器无法实行EXECUTE语句调用,而是在客户施行Transact-SQL语句时自动触发试行。

    1、触发器简单介绍
      触发器能够查询其余表,而且能够包罗复杂的SQL语句。它们主要用以强征死守复杂的政工准则或供给。比如:您可以依附顾客当前的帐户状态,调控是不是允许插入新订单。
      触发器也可用来强制引用完整性,以便在多个表中丰裕、更新或删除行时,保留在此些表之间所定义的关系。然则,强制援引完整性的最佳法子是在相关表中定义主键和外键节制。若是利用数据库关系图,则足以在表之间创建关系以机关成立外键限制。
      SQL Server 蕴含三种符合规律项目标触发器:DML 触发器、DDL 触发器和登陆触发器。
    DML触发器
      当数据库中表中的数据发生变化时,包罗insert,update,delete任性操作,若是大家对该表写了相应的DML触发器,那么该触发器自动实行。DML触发器的首要性功效在于强制实践当务准则,以致扩充Sql Server约束,暗中认可值等。因为大家精通限定只好节制同叁个表中的数额,而触发器中则能够试行大肆Sql命令。
    DDL触发器
      它是Sql Server二〇〇七新添的触发器,首要用来调查与规范对数据库中表,触发器,视图等组织上的操作。比方在改造表,修正列,新添表,新添列等。它在数据库结构发生变化时实行,我们首要用它来记录数据库的改革进度,以致限定技士对数据库的校正,比方不允许删除有个别钦命表等。
    签到触发器
      登入触发器将为响应 LOGON 事件而激情存款和储蓄进程。与 SQL Server 实例建立客户会话时将抓住那件事件。登陆触发器将在登入的身份验证阶段达成之后且客商会话实际建设构造从前激发。由此,来自触发器内部且常常将达到客商的富有消息(比如错误消息和来源 P汉兰达INT 语句的音讯卡塔尔会传递到 SQL Server 错误日志。若是身份验证退步,将不激情登陆触发器。

    2、创建SQL语法

    1 DELIMITER |
    2 CREATE TRIGGER `<databaseName>`.`<triggerName>`
    3 < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
    4 ON [dbo]<tableName> //dbo代表该表的所有者
    5 FOR EACH ROW
    6 BEGIN
    7 --do something
    8 END |
    

    3、触发器的帮助和益处

      触发器可因此数据库中的相关表实现级联校正,可是,通过级联援引完整性节制能够更平价地实施这个改换。触发器可以强制比用CHECK节制定义的封锁越来越复杂的封锁。与 CHECK 限定不相同,触发器能够引用其余表中的列。例如,触发器能够使用另二个表中的 SELECT 比较插入或更新的数目,以致实行其它操作,如改革数据或出示客商定义错误音信。触发器也可以评估数据修改前后的表状态,并依赖其差别选拔对策。五个表中的八个同类触发器(INSERT、UPDATE 或 DELETE卡塔 尔(阿拉伯语:قطر‎允许利用七个不一致的攻略以响应同一个纠正语句。

    4、比较触发器和平条节制

      节制和触发器在特殊意况下各有优势。

      触发器的关键利润在于它们可以分包使用 Transact-SQL 代码的繁杂管理逻辑。因而,触发器可以扶持自律的具备机能;但它在所付出的作用上并不再而三最佳的不二等秘书诀。实体完整性总应在低于品级上经过索引进行强制,这个索引或是 PEscortIMAEscortY KEY 和 UNIQUE 约束的后生可畏有的,或是在封锁之外独立创设的。要是功效能够满意应用程序的听从必要,域完整性应透过 CHECK 限定实行强制,而援用完整性(陆风X8I) 则应通过 FOREIGN KEY 约束进行强制。在封锁所支撑的效应不可能满意应用程序的效果与利益须要时,触发器就颇为有用。
      举例:除非 REFERENCES 子句定义了级联援用操作,不然 FOREIGN KEY 限制只好以与另一列中的值完全匹配的值来评释列值。
      CHECK 限定只能根据逻辑表达式或相仿表中的另一列来证实列值。万一应用程序要求依据另贰个表中的列验证列值,则必需利用触发器。节制只可以通过标准的类别错误新闻传递错误音讯。借使应用程序须求运用(或能从当中受益卡塔尔自定义新闻和较为复杂的错误管理,则必须选用触发器。
      触发器可经过数据库中的相关表完结级联改良;可是,通过级联援引完整性约束能够更管用地试行这么些改造。触发器能够禁绝或回滚违反援用完整性的改变,进而撤销所尝试的数据校勘。当修正外键且新值与主键不相称时,此类触发器就可能产生作用。举例,能够在 titleauthor.title_id 上创办四个安顿触发器,使它在新值与 titles.title_id 中的某些值不相配时回滚三个插入。不过,平常选用 FOREIGN KEY 来达成那几个目标。
      假设触发器表上存在限制,则在 INSTEAD OF 触发器推行后但在 AFTESportage触发器试行前检查那些约束。如果封锁破坏,则回滚 INSTEAD OF 触发器操作而且不推行 AFTEEnclave 触发器。
    触发器到底可不得以在视图上创立 在 SQL Server™ 联机丛书中,是一贯不说触发器不能够在视图上成立的, 何况在语法解释中评释:在 CREATE TWranglerIGGECRUISER 的 ON 之后能够是视图。 不过,事实仿佛并非这么,超级多读书人也说触发器不可能在视图上创办。小编也特意作了测量试验,的确如此,不管是通常视图依旧索引视图,都无法在上头创制触发器,真的是这么呢?
      请点击详细,不过无可非议的是:当在不时表或系统表上创立触发器时会遭到驳回。
      浓烈驾驭 FO宝马X3 CREATE TPAJEROIGGE福睿斯 语句的 FO讴歌ZDX 关键字之后方可跟 INSERT、UPDATE、DELETE 中的三个或七个,也正是说在任何情状下是不会触发触发器的, 包括SELECT、TRUNCATE、W帕杰罗ITETEXT、UPDATETEXT。
      相关内容 多个交相辉映的施用大家看来超多登记系统在注册后都不能校正顾客名,但那多半是由应用程序决定的, 假如直接张开数据库表张开校勘,类似能够修改其顾客名, 在触发器中使用回滚就能够玄妙地落实不可能校勘客户名……详细内容 触发器内部语句出错开上下班时间…… 这种景况下,前面前蒙受数据变动操作将会没有抓住要点。比如,在表中插入数据时触发触发器,而触发器内部那时候产生了运维时不当,那么将赶回二个荒诞值,何况推却刚才的数码插入。不可能在触发器中选用的讲话 触发器中能够使用大非常多 T-SQL 语句,但正如一些口舌是不可能在触发器中利用的。
      CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
      ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
      DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
      DISK 语句,如:DISK INIT、DISK RESIZE。
      LOAD 语句,如:LOAD DATABASE、LOAD LOG。
      RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
      RECONFIGURE
      TRUNCATE TABLE 语句在sybase的触发器中不可使用!

    5、慎用触发器

      触发器成效强盛,轻便可信赖地落到实处广大犬牙相错的机能,为何又要慎用呢。触发器本身未有偏差,但出于大家的滥用会导致数据库及应用程序的保卫安全困难。在数据库操作中,大家能够透过涉及、触发器、存款和储蓄进程、应用程序等来兑现数量操作…… 同期准绳、约束、缺省值也是保险数据完整性的要紧保障。借使大家对触发器过分的信赖,势必影响数据库的构造,同不常间扩张了保障的复杂程度。

    6、SQL Server示例:

     1 --insert 触发器示例
     2 create trigger tri_insert
     3 on student
     4 for insert
     5 as
     6 declare @student_id char(10)
     7 select @student_id=s.student_id from student s inner join inserted i on s.student_id=i.student_id
     8 if @student_id='0000000001'
     9   begin
    10     raiserror('不能插入1的学号!',16,8)
    11     rollback tran
    12   end
    13 go
    14 --update触发器示例
    15 create trigger tri_update
    16 on student
    17 for update
    18 as
    19 if update(student_id)
    20   begin
    21     raiserror('学号不能修改!',16,8)
    22     rollback tran
    23   end
    24 go
    25 --delete触发器示例
    26 create trigger tri_delete
    27 on student
    28 for delete
    29 as
    30 declare @student_id varchar(10)
    31 select @student_id=student_id from deleted
    32 if @student_id='admin'
    33   begin
    34     raiserror('错误',16,8)
    35     rollback tran
    36   end
    

     

    server中定义了生龙活虎雨后春笋操作的的二个经过,只要调用他就能够做到相应的操作.

         存款和储蓄进度定义:
    将常用的或很复杂的劳作,预先用SQL语句写好并用多少个钦点的名称存款和储蓄起来, 那么现在要叫数据库提供与已定义好的蕴藏进程的意义雷同的劳务时,只需调用execute,就能够自动落成命令。

    那么存款和储蓄进度与日常的SQL语句有何样分别呢?
    储存进程的长处:
    1.囤积进程只在创即刻开展编译,未来每回推行存款和储蓄进度都不需再另行编译,而雷同SQL语句每实施三回就编写翻译一回,所以使用存款和储蓄进程可增长数据库实践进度。
    2.当对数据库实行复杂操作时(如对七个表实行Update,Insert,Query,Delete时卡塔尔国,可将此复杂操功效存款和储蓄进度封装起来与数据库提供的事务管理结合一齐使用。
    3.存款和储蓄进程能够重复使用,可裁减数据库开拓人士的劳作量 。
    4.安全性高,可设定独有某此顾客才有所对点名存款和储蓄进程的使用权。

    存款和储蓄进度的项目:
    1.类别存款和储蓄进程:以sp_发端,用来开展系统的各样设定.得到新闻.相关处理专业,
    如 sp_help正是获得钦定对象的相关音讯
    2.扩展存款和储蓄进程 以XP_初步,用来调用操作系统提供的效果与利益
    exec master..xp_cmdshell 'ping 10.8.16.1'

    触发器(2)

    1、DML触发器分为二种(AFTEEnclave触发器和INSTEAD OF触发器卡塔 尔(阿拉伯语:قطر‎
    AFTE兰德ENVISION触发器(之后触发卡塔 尔(英语:State of Qatar)
      也叫FO安德拉触发器,after触发器要求独有实行某后生可畏操作insert、update、delete之后触发器才被触发,且只好定义在表上。(AFTETiguan 触发器只可以在表上钦点,且动作晚于节制管理。)
    INSTEAD OF 触发器(在此以前接触卡塔 尔(英语:State of Qatar)
      而instead of触发器表示并不进行其定义的操作(insert、update、delete卡塔尔国而仅是实行触发器自己。不仅能在表上定义instead of触发器,也足以在视图上定义。 
      触发器有八个优越的表:插入表(instered表卡塔尔国和删除表(deleted表卡塔 尔(英语:State of Qatar)。这两张是逻辑表也是虚表。有系统在内部存款和储蓄器中成立者两张表,不会蕴藏在数据库中。并且两张表的都以只读的,只好读取数据而无法更改数据。这两张表的结果总是与被改触发器应用的表的结构肖似。当触发器实现职业后,这两张表就能够被剔除。Inserted表的数据是插入或是改善后的数量,而deleted表的数量是立异前的可能删除的数目。(INSTEAD OF 触发器的动作要早于表的羁绊管理)

    对表的操作 Inserted逻辑表 Deleted逻辑表
    增加记录(insert) 存放增加的记录
    删除记录(delete) 存放被删除的记录
    修改记录(update) 存放更新后的记录 存放更新前的记录

    Update数据的时候正是先删除表记录,然后扩充一条记下。那样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事情,所以在触发器里面能够对改良数据开展部分杰出的反省。假诺不满意能够采纳职业回滚,撤除操作。

    2、启用禁止使用触发器

     

    1 --禁用触发器
    2 disable trigger tgr_message on student;
    3 --启用触发器
    4 enable trigger tgr_message on student;
    

    3、查询成立的触发器消息

     1 --查询已存在的触发器
     2 select * from sys.triggers;
     3 select * from sys.objects where type = 'TR';
     4 
     5 --查看触发器触发事件
     6 select te.* from sys.trigger_events te join sys.triggers t
     7 on t.object_id = te.object_id
     8 where t.parent_class = 0 and t.name = 'tgr_valid_data';
     9 
    10 --查看创建触发器语句
    11 exec sp_helptext 'tgr_message';
    

    4、# 示例,操作日志

     1 if (object_id('log', 'U') is not null)
     2     drop table log
     3 go
     4 create table log(
     5     id int identity(1, 1) primary key,
     6     action varchar(20),
     7     createDate datetime default getDate()
     8 )
     9 go
    10 if (exists (select * from sys.objects where name = 'tgr_student_log'))
    11     drop trigger tgr_student_log
    12 go
    13 create trigger tgr_student_log
    14 on student
    15 after insert, update, delete
    16 as
    17     if ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))
    18     begin
    19         insert into log(action) values('updated');
    20     end
    21     else if (exists (select 1 from inserted) and not exists (select 1 from deleted))
    22     begin
    23         insert into log(action) values('inserted');
    24     end
    25     else if (not exists (select 1 from inserted) and exists (select 1 from deleted))
    26     begin
    27         insert into log(action) values('deleted');
    28     end
    29 go
    30 --test
    31 insert into student values('king', 22, 1, 7);
    32 update student set sex = 0 where name = 'king';
    33 delete student where name = 'king';
    34 select * from log;
    35 select * from student order by id;
    

     

    SQL触发器

      触发器是风度翩翩种奇特类型的仓库储存进程,不由客商一贯调用。创造触发器时会对其开展定义,以便在对特定表或列作特定项目标数码修改时执行。

      CREATE PROCEDURE 或 CREATE TXC90IGGE中华V 语句不能够超过批处理。即存款和储蓄过程或触发器始终只能在二个批管理中创立并编写翻译到一个实行布署中。

      用触发器还能强制推行当务法则

      Microsoft SQL Server™ 二〇〇三提供了两种重大机制来强制业务法则和数据完整性:节制和触发器。触发器是大器晚成种奇特类型的储存进程,它在钦命的表中的数额发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器能够查询其他表,并得以满含复杂的 Transact-SQL讲话。将触发器和接触它的语句作为可在触发器内回滚的单个事务对待。若是检查评定到严重错误(比如,磁盘空间不足卡塔尔国,则整个事情即自行回滚。

    3.客户自定义的囤积进程,那是大家所指的仓库储存进度

    触发器(trigger卡塔尔国是个极度的储存进程,它的实行不是由程序调用,亦非手工业运维,而是由个事件来触发,例如当对叁个表张开操作( insert,delete, update卡塔尔时就能够激活它执行。触发器日常用来抓好数据的完整性节制和业务法则等。 触发器能够从 DBA_TRIGGERS ,USER_TRubiconIGGEEnclaveS 数据字典中查到。

      触发器可以查询别的表,何况能够分包复杂的 SQL 语句。它们重要用以强制伏从复杂的工作准绳或需要。比方:您能够依据顾客当前的帐户状态,控制是或不是同意插入新订单。

      触发器也可用来强制引用完整性,以便在八个表中丰盛、更新或删除行时,保留在这里些表之间所定义的涉嫌。可是,强制引用完整性的最棒办法是在相关表中定义主键和外键节制。假设采取数据库关系图,则足以在表之间创立关系以活动创立外键节制。

      创制触发器的SQL语法

      DELIMITER |

      CREATE TRIGGER ``.``

        

      ON  

      FOR EACH ROW

      BEGIN

      --do something

      END |

      触发器的独特之处

      触发器可由此数据库中的相关表达成级联改善;不过,通过级联援用完整性约束能够更实用地实行这几个更改。触发器能够强制比用 CHECK 约束定义的羁绊越来越复杂的牢笼。与 CHECK 节制分化,触发器能够援引别的表中的列。举例,触发器能够运用另一个表中的 SELECT 比较插入或更新的多少,以至执行此外操作,如匡正数据或展现客商定义错误音信。触发器也得以评估数据改正前后的表状态,并基于其间隔选取对策。二个表中的八个同类触发器(INSERT、UPDATE 或 DELETE卡塔 尔(英语:State of Qatar)允许行使四个不等的机关以响应同一个改造语句。

      相比触发器与约束

      节制和触发器在格外情况下各有优势。触发器的关键利润在于它们可以富含使用 Transact-SQL 代码的纷纷处理逻辑。因而,触发器能够支撑自律的享有效能;但它在所提交的职能上并不总是最佳的不二诀窍。实体完整性总应在低于等第上通过索引进行强制,那一个索引或是 P奥迪Q5IMA揽胜极光Y KEY 和 UNIQUE 节制的生机勃勃有的,或是在约束之外独立成立的。如若成效能够满意应用程序的效果需求,域完整性应通过 CHECK 限定实行强制,而援引完整性 (传祺I) 则应透过 FOREIGN KEY 约束进行强制。在节制所辅助的效益不可能满意应用程序的意义须要时,触发器就颇为有用。

      比如:除非 REFERENCES 子句定义了级联援用操作,否则 FOREIGN KEY 节制只好以与另一列中的值完全相配的值来验证列值。

      CHECK 节制只可以依赖逻辑表明式或大器晚成致表中的另一列来注明列值。尽管应用程序必要根据另贰个表中的列验证列值,则必得选拔触发器。

      约束只可以通过专门的职业的系统错误音信传递错误新闻。假使应用程序须要使用(或能从当中收益卡塔尔国自定义务消防队息和比较复杂的错误管理,则必需采纳触发器。

      触发器可通过数据库中的相关表达成级联校勘;可是,通过级联援用完整性限定可以更实用地进行那些更改。

      触发器能够禁绝或回滚违反引用完整性的更正,进而撤消所尝试的数目改进。当改进外键且新值与主键不相配时,此类触发器就恐怕产生成效。举例,能够在 titleauthor.title_id 上创造三个插入触发器,使它在新值与 titles.title_id 中的某些值不相配时回滚二个插入。不过,常常采用 FOREIGN KEY 来完成那一个指标。

      若是触发器表上存在约束,则在 INSTEAD OF 触发器推行后但在 AFTE奥迪Q3触发器实施前检查这几个约束。假若封锁破坏,则回滚 INSTEAD OF 触发器操作而且不试行 AFTE奥迪Q5 触发器。

      触发器到底可不得以在视图上创制 在 SQL Server™ 联机丛书中,是未有说触发器无法在视图上开创的, 何况在语法解释中标记:

      在 CREATE TENVISIONIGGESportage 的 ON 之后能够是视图。 然则,事实就像并非这么,超级多读书人也说触发器无法在视图上创立。笔者也特地作了测量试验,的确如此,不管是平凡视图仍然索引视图,都无法在地点创制触发器,真的是这么呢?请点击详细,然而未有可过分训斥的是:当在临时表或系统表上创造触发器时会遭到驳倒。 深远精晓 FOCR-V CREATE TCR-VIGGEWrangler 语句的 FO索罗德 关键字之后能够跟 INSERT、UPDATE、DELETE 中的一个或四个,也正是说在其他境况下是不会接触触发器的, 包蕴SELECT、TRUNCATE、WENCOREITETEXT、UPDATETEXT。相关内容 三个妙趣横生的施用我们看来好些个登记系统在注册后都不能够修改顾客名,但那多半是由应用程序决定的, 如若直接展开数据库表张开校订,同样能够转移其客户名, 在触发器中使用回滚就足以美妙地落到实处不可能修改客商名……详细内容 触发器内部语句出错开上下班时间…… 这种状态下,前边对数据变动操作将会失效。举个例子,在表中插入数据时触发触发器,而触发器内部那时候发生了运营时不当,那么将赶回一个怪诞值,况且谢绝刚才的数目插入。不能够在触发器中接纳的说话 触发器中能够使用大非常多 T-SQL 语句,但正如一些口舌是无法在触发器中利用的。

      CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。

      ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。

      DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。

      DISK 语句,如:DISK INIT、DISK RESIZE。

      LOAD 语句,如:LOAD DATABASE、LOAD LOG。

      RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。

      RECONFIGURE

      TRUNCATE TABLE 语句在sybase的触发器中不可使用!

      慎用触发器 触发器功效强盛,轻易可信赖地促成广大根深蒂固的职能,为何又要慎用呢。触发器本人并没错误,但鉴于我们的滥用会促成数据库及应用程序的护卫困难。在数据库操作中,我们得以因此关系、触发器、存款和储蓄进程、应用程序等来兑现多少操作…… 同不常间准绳、约束、缺省值也是保障数据完整性的首要性保障。借使大家对触发器过分的信任性,势必影响数据库的布局,同期扩充了珍爱的纷纭程序.

    优点

      触发器可透过数据库中的相关表落成级联更正;不过,通过级联引用完整性约束能够更实用地推行这几个改造。

      触发器能够强制比用 CHECK 约束定义的羁绊更加的复杂的羁绊。

      与 CHECK 约束不相同,触发器能够援用其余表中的列。举例,触发器能够动用另叁个表中的 SELECT 相比插入或更新的数量,以至推行此外操作,如改革数据或展现客户定义错误音讯。

      触发器也得以评估数据改进前后的表状态,并基于其差别接纳对策。

      三个表中的多个同类触发器(INSERT、UPDATE 或 DELETE卡塔 尔(阿拉伯语:قطر‎允许利用多少个例外的计谋性以响应同三个校正语句。

      相比触发器与限制

      限定和触发器在非常规情状下各有优势。触发器的主要收益在于它们得以蕴含使用 Transact-SQL 代码的复杂管理逻辑。因而,触发器可以支撑自律的保有机能;但它在所提交的作用上并不再三再四最佳的方法。

      实体完整性总应在低于等第上通过索引实行强制,这一个索引或是 P奥迪Q5IMA福睿斯Y KEY 和 UNIQUE 约束的一片段,或是在封锁之外独立创立的。假若功用能够满意应用程序的效能须求,域完整性应通过 CHECK 限制进行强制,而援用完整性 (TiggoI) 则应通过 FOREIGN KEY 限定进行强制。

      在封锁所协理的功能无法知足应用程序的效用供给时,触发器就颇为有用。举个例子:

      除非 REFERENCES 子句定义了级联援引操作,不然 FOREIGN KEY 限定只可以以与另一列中的值完全相配的值来证实列值。

      CHECK 约束只好依赖逻辑表明式或同等表中的另一列来验证列值。假设应用程序必要依据另三个表中的列验证列值,则必得使用触发器。

      节制只可以通过正规的系统错误音信传递错误音信。假设应用程序需要利用(或能从当中受益卡塔尔自定义新闻和相比复杂的错误管理,则必需运用触发器。

      触发器可因此数据库中的相关表实现级联更正;可是,通过级联引用完整性约束能够更平价地进行这个改过。

      触发器可避防止或回滚违反引用完整性的改造,进而废除所尝试的多寡改进。当校订外键且新值与主键不相配时,此类触发器就也许暴发功用。举个例子,能够在 titleauthor.title_id 上创立二个插入触发器,使它在新值与 titles.title_id 中的有个别值不相称时回滚三个插入。可是,日常接纳 FOREIGN KEY 来完成那个目标。

      假使触发器表上设有限定,则在 INSTEAD OF 触发器试行后但在 AFTE奇骏触发器实施前检查这个节制。要是封锁破坏,则回滚 INSTEAD OF 触发器操作而且不进行 AFTEPAJERO 触发器。

    SQL触发器语法

      语法

      CREATE TRIGGER trigger_name

      ON { table | view }

      [ WITH ENCRYPTION ]

      {

      { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }

      [ WITH APPEND ]

      [ NOT FOR REPLICATION ]

      AS

      [ { IF UPDATE ( column )

      [ { AND | OR } UPDATE ( column ) ]

      [ ...n ]

      | IF ( COLUMNS_UPDATED ( ) updated_bitmask )

      column_bitmask [ ...n ]

      } ]

      sql_statement [ ...n ]

      }

      }

      参数

      trigger_name

      是触发器的称谓。触发器名称必需切合标识符准绳,何况在数据库中必得唯意气风发。能够筛选是还是不是钦定触发器全数者名称。

      Table | view

      是在其上施行触发器的表或视图,临时称为触发器表或触发器视图。可以选择是不是钦命表或视图的主人名称。

      WITH ENCRYPTION

      加密 syscomments 表中包涵 CREATE T本田UR-VIGGE奥德赛 语句文本的条目款项。使用 WITH ENCLX570YPTION 可防备将触发器作为 SQL Server 复制的风流浪漫有的发布。

      AFTER

      内定触发器独有在触发 SQL 语句中钦赐的全体操作皆已经成功实行后才点燃。全部的援引级联操作和自律检查也必得成功完毕后,技艺进行此触发器。

      假若仅钦命 FO汉兰达 关键字,则 AFTE翼虎 是暗中认可设置。

      不可能在视图上定义 AFTE景逸SUV 触发器。

      INSTEAD OF

      钦赐实行触发器并非实践触发 SQL 语句,进而代替触发语句的操作。

      在表或视图上,每一种 INSERT、UPDATE 或 DELETE 语句最多能够定义三个INSTEAD OF 触发器。但是,能够在各类具备 INSTEAD OF 触发器的视图上定义视图。

      INSTEAD OF 触发器不可能在 WITH CHECK OPTION 的可更新视图上定义。假设向钦赐了 WITH CHECK OPTION 选项的可更新视图加多INSTEAD OF 触发器,SQL Server 将时有产生贰个荒诞。客商必需用 ALTE昂Cora VIEW 删除该选项后技能定义 INSTEAD OF 触发器。

      { [DELETE] [,] [INSERT] [,] [UPDATE] }

    触发器的分解。  是钦点在表或视图上举行怎么样数据修正语句时将激活触发器的主要字。必需起码内定一个精选。在触发器定义中允许行使以自由顺序组合的那个注重字。假使钦命的选项多于三个,需用逗号分隔这几个选用。

      对于 INSTEAD OF 触发器,不允许在装有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也分裂目的在于颇负 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

      WITH APPEND

      内定相应加上现成项指标其余触发器。只有当包容等级是 65 或更低时,才须要采纳该可选子句。假使同盟等级是 70 或越来越高,则不用选择WITH 应用程式END 子句增多现成项指标任何触发器(这是特别等级设置为 70 或越来越高的 CREATE T冠道IGGE汉兰达 的暗中同意行为卡塔 尔(英语:State of Qatar)。有关更多音讯,请参见 sp_dbcmptlevel。

      WITH 应用软件END 不能够与 INSTEAD OF 触发器一同行使,或许,若是显式申明AFTE大切诺基 触发器,也没办法运用该子句。独有当出于向后特别而指定 FO帕杰罗 时(未有INSTEAD OF 或 AFTEOdyssey卡塔 尔(英语:State of Qatar),技术接受 WITH 应用程式END。今后的本子将不扶持 WITH APPEND 和 FO奥德赛(将被解释为 AFTE汉兰达卡塔 尔(英语:State of Qatar)。

      NOT FOR REPLICATION

      代表当复制进度更正触发器所涉嫌的表时,不应推行该触发器。

      AS

      是触发器要奉行的操作。

      sql_statement

      是触发器的尺度和操作。触发器条件内定别的法规,以分明 DELETE、INSERT 或 UPDATE 语句是或不是产生实施触发器操作。

      当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中钦命的触发器操作将生效。

      触发器能够包含自由数量和项目标 Transact-SQL 语句。触发器意在依据数量改革语句检查或更改数据;它不应将数据再次来到给客商。触发器中的 Transact-SQL 语句平时富含调节流语言。CREATE TCRUISERIGGE大切诺基语句中选用多少个新鲜的表:

      * deleted 和 inserted 是逻辑(概念卡塔 尔(英语:State of Qatar)表。那些表在结构上近似于概念触发器的表(也等于在在那之中尝试客户操作的表卡塔 尔(阿拉伯语:قطر‎;那些表用于保存客户操作大概改动的行的旧值或新值。举例,若要检索 deleted 表中的全数值,请使用:

      SELECT *

      FROM deleted

      * 假诺协作品级等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不容许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不可能访谈 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中查找新值,请将 inserted 表与原来修正表联接。当包容等级是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将再次回到空值;尽管这个列不可为空,则赶回零长度字符串。

      当宽容品级是 80 或更加高时,SQL Server 允许在表或视图上经过 INSTEAD OF 触发器更新 text、ntext 或 image 列。

      n

      是象征触发器中能够分包多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,能够透过重新 UPDATE (column) 子句包蕴多列。

      IF UPDATE (column)

      测量检验在钦赐的列上举办的 INSERT 或 UPDATE 操作,不可能用于 DELETE 操作。能够钦命多列。因为在 ON 子句中钦点了表名,所以在 IF UPDATE 子句中的列名前并非满含表名。若要测验在多少个列上举行的 INSERT 或 UPDATE 操作,请在首先个操作后钦点单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将回到 TRUE 值,因为这么些列插入了显式值或隐性 (NULL) 值。

      表明 IF UPDATE (column) 子句的功用相同 IF、IF...ELSE 或 WHILE 语句,何况可以选拔 BEGIN...END 语句块。有关愈来愈多消息,请参见调节流语言。

      可以在触发器主体中的任意地点运用 UPDATE (column)。

      column

      是要测量检验 INSERT 或 UPDATE 操作的列名。该列能够是 SQL Server 扶助的此外数据类型。不过,计算列无法用于该境况中。有关更加多消息,请参见数据类型。

      IF (COLUMNS_UPDATED())

      测验是不是插入或更新了聊到的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 再次回到 varbinary 位方式,表示插入或更新了表中的怎么列。

      COLUMNS_UPDATED 函数以从左到右的逐意气风发重返位,最左侧的为最不重要的位。最侧面的位表示表中的首先列;向右的下一位代表第二列,就那样推算。假诺在表上创制的触发器包罗8 列以上,则 COLUMNS_UPDATED 重回多少个字节,最左边的为最不首要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对持有列重返 TRUE 值,因为那些列插入了显式值或隐性 (NULL) 值。

      能够在触发器主体中的任性地点应用 COLUMNS_UPDATED。

      bitwise_operator

      是用以相比运算的位运算符。

      updated_bitmask

      是整型位掩码,表示其实改良或插队的列。举个例子,表 t1 包罗列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是还是不是都有更新,钦定值 14;若要检查是或不是独有列 C2 有更新,内定值 2。

      comparison_operator

      是比较运算符。使用等号 (=) 检查 updated_bitmask 中钦赐的具有列是或不是都实际实行了立异。使用过量号 (>) 检查 updated_bitmask 中钦定的任一列或一些列是不是已履新。

      column_bitmask

      是要检查的列的整型位掩码,用来检查是不是已履新或插队了那一个列。

      注释

      触发器平日用于强制业务法则和数据完整性。SQL Server 通过表创设语句(ALTELX570 TABLE 和 CREATE TABLE卡塔尔提供申明引用完整性(D奥德赛I);不过DPAJEROI 不提供数据库间的援引完整性。若要强制引用完整性(有关表的主键和外键之间关系的规行矩步卡塔 尔(阿拉伯语:قطر‎,请使用主键和外键限定(ALTER TABLE 和 CREATE TABLE 的 P普拉多IMAWranglerY KEY 和 FOREIGN KEY 关键字卡塔尔国。倘诺触发器表存在封锁,则在 INSTEAD OF 触发器施行之后和 AFTE奥迪Q7触发器执行在此之前检查那一个节制。要是背离了束缚,则回滚 INSTEAD OF 触发器操作且不推行(激发卡塔尔国AFTECRUISER 触发器。

      可用 sp_settriggerorder 内定表上首先个和末段贰个实践的 AFTEEnclave触发器。在表上只可以为种种 INSERT、UPDATE 和 DELETE 操作钦定八个第二个执行和一个末段三个施行的 AFTEEnclave触发器。假如同一表上还会有别的 AFTE福睿斯触发器,则那个触发器将以随机顺序施行。

      如若 ALTEKuga T奥迪Q7IGGEWrangler语句校正了第叁个或最终三个触发器,则将除了已修改触发器上设置的首先个或最终贰个风味,何况必需用 sp_settriggerorder 重新初始化排序值。

      唯有当触发 SQL 语句(满含具有与更新或删除的指标关系的援引级联操作和束缚检查卡塔 尔(阿拉伯语:قطر‎成功推行后,AFTERAV4触发器才会实行。AFTE凯雷德触发器检查触发语句的周转效果,以至具备由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果与利益。

      触发器约束

      CREATE T奇骏IGGEXC90 必需是批管理中的第一条语句,何况一定要动用到一个表中。

      触发器只可以在这里时此刻的数据库中开创,可是触发器能够援用当前数据库的表面临象。

      如果内定触发器全部者名称以节制触发器,请以相仿的主意界定表名。

      在长久以来条 CREATE T逍客IGGECRUISER 语句中,可以为八种顾客操作(如 INSERT 和 UPDATE卡塔尔定义相通的触发器操作。

      假若叁个表的外键在 DELETE/UPDATE 操作上定义了级联,则无法在该表上定义 INSTEAD OF DELETE/UPDATE 触发器。

      在触发器内得以钦赐恣意的 SET 语句。所接收的 SET 选项在触发器推行时期有效,并在触发器施行完后出山小草到从前的安装。

      与使用存款和储蓄进程同样,当触发器激发时,将向调用应用程序再次回到结果。若要防止由于触发器激发而向应用程序再次来到结果,请不要蕴涵重回结果的 SELECT 语句,也决不包涵在触发器中张开变量赋值的言语。包括向客户再次回到结果的 SELECT 语句或举办变量赋值的言辞的触发器须要极其管理;那一个再次来到的结果必得写入允许修正触发器表的各样应用程序中。假若非得在触发器中开展变量赋值,则应该在触发器的开首使用 SET NOCOUNT 语句防止止再次来到任何结果集。

      DELETE 触发器不可能捕获 TRUNCATE TABLE 语句。固然 TRUNCATE TABLE 语句实乃还未有 WHERE 子句的 DELETE(它删除所有行卡塔尔国,但它是无日志记录的,由此不能够奉行触发器。因为 TRUNCATE TABLE 语句的权限暗中同意付与表全体者且不可让渡,所以只有表全体者才须求构思无意中用 TRUNCATE TABLE 语句走避 DELETE 触发器的主题材料。

      无论有日记记录照旧无日志记录,WPortofinoITETEXT 语句都不激活触发器。

      触发器中差异意以下 Transact-SQL 语句:

      ALTER DATABASE CREATE DATABASE DISK INIT

      DISK RESIZE DROP DATABASE LOAD DATABASE

      LOAD LOG RECONFIGURE RESTORE DATABASE

      RESTORE LOG

      表达 由于 SQL Server 不扶植系统表中的顾客定义触发器,由此提议不用在系统表中创设客户定义触发器。

      多少个触发器

      SQL Server 允许为种种数据校正事件(DELETE、INSERT 或 UPDATE卡塔尔国创制多少个触发器。举例,如若对本来就有 UPDATE 触发器的表执行 CREATE T福特ExplorerIGGEPRADO FOR UPDATE,则将创建另三个立异触发器。在先前时代版本中,在种种表上,每一种数据改进事件(INSERT、UPDATE 或 DELETE卡塔 尔(英语:State of Qatar)只同意有二个触发器。

      表达 假如触发器名称分歧,则 CREATE TCRUISERIGGERubicon(包容品级为 70卡塔尔的私下认可行为是在存活的触发器中增多其他触发器。假使触发器名称风姿洒脱致,则 SQL Server 再次回到一条错误信息。但是,借使相称等第等于或低于 65,则采纳CREATE T君越IGGELacrosse语句成立的新触发器将替换同生机勃勃类别的其他现存触发器,纵然触发器名称差别。有关更加的多新闻,请参见 sp_dbcmptlevel。

      递归触发器

      当在 sp_dboption 中启用 recursive triggers 设置时,SQL Server 还允许触发器的递归调用。

      递归触发器允许产生三种档期的顺序的递归:

      * 直接递归

      * 直接递归

      使用直接递归时,应用程序更新表 T1,进而激发触发器 TR1,该触发器更新表 T2。在此种情景下,触发器 T2 将激发并改过 T1。

      使用直接递归时,应用程序更新表 T1,进而激发触发器 TSportage1,该触发器更新表 T1。由于表 T1 被更新,触发器 T奥迪Q51 再一次激起,就那样类推。

      下例既使用了直接触发器递归,又利用了第一手触发器递归。假定在表 T1中定义了八个立异触发器 T奥迪Q31 和 TWrangler2。触发器 T奇骏1 递归地换代表 T1。UPDATE 语句使 TPRADO1 和 TCRUISER2 各施行壹次。而 T昂Cora1 的试行将触发 T奇骏1(递归卡塔 尔(英语:State of Qatar)和 TXC902 的实践。给定触发器的 inserted 和 deleted 表只含有与唤醒调用触发器的 UPDATE 语句相呼应的行。

      表达 只有启用 sp_dboption 的 recursive triggers 设置,才会时有爆发上述行为。对于为给定事件定义的四个触发器,并未规定的施行顺序。每一种触发器都应是自包蕴的。

      禁止使用 recursive triggers 设置只可以幸免直接递归。若要也禁止使用直接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0。

      如若任一触发器施行了 ROLLBACK TRANSACTION 语句,则无论嵌套级是多少,都不会更为实践此外触发器。

      嵌套触发器

      触发器最多能够嵌套 32 层。假使叁个触发器改良了富含另二个触发器的表,则第叁个触发器将激活,然后该触发器能够再调用第八个触发器,以此类推。假诺链中自由多少个触发器引发了十二万分循环,则会高于嵌套级节制,进而招致废除触发器。若要禁止使用嵌套触发器,请用 sp_configure 将 nested triggers 选项设置为 0(关闭)。暗中认可配置允许嵌套触发器。要是嵌套触发器是关门的,则也将禁止使用递归触发器,与 sp_dboption 的 recursive triggers 设置无关。

      延迟名称拆解剖判

      SQL Server 允许 Transact-SQL 存储进度、触发器和批管理援用编写翻译时不设有的表。这种技能称为延迟名称深入解析。不过,要是Transact-SQL 存款和储蓄进程、触发器或批管理援用在仓库储存进度或触发器中定义的表,则只有当包容品级设置(通过执行sp_dbcmptlevel 设置卡塔尔国等于 65 时,才会在成立时发生警报。假使利用批管理,则在编写翻译时发出警告。假使援引的表不设有,就要运转时重返错误信息。有关越多新闻,请参见延迟名称剖析和编写翻译。

      权限

      CREATE TRAV4IGGE大切诺基 权限默许付与定义触发器的表全体者、sysadmin 固定服务器剧中人物成员以至 db_owner 和 db_ddladmin 固定数据库剧中人物成员,並且不可转让。

      若要检索表或视图中的数据,客商必需在表或视图中负有 SELECT 语句权限。若要更新表或视图的内容,客户必需在表或视图中持有 INSERT、DELETE 和 UPDATE 语句权限。

      假设视图中存在 INSTEAD OF 触发器,顾客必须在该视图中有 INSERT、DELETE 和 UPDATE 特权,以对该视图发出 INSERT、DELETE 和 UPDATE 语句,而任由实际上是不是在视图上推行了那样的操作。

      示例

      A. 使用含有提醒音讯的触发器

      当有人计划在 titles 表中加上或转移数据时,下例将向客户端体现一条音讯。

      表明 音信 50009 是 sysmessages 中的客户定义新闻。有关创制客商定义音讯的越来越多消息,请参见 sp_addmessage。

      USE pubs

      IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'reminder' AND type = 'TR')

      DROP TRIGGER reminder

      GO

      CREATE TRIGGER reminder

      ON titles

      FOR INSERT, UPDATE

      AS RAISERROR (50009, 16, 10)

      GO

      B. 使用含有提示电子邮件的触发器

      当 titles 表改正时,下例将电子邮件发送给内定的人手 (MaryM)。

      USE pubs

      IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'reminder' AND type = 'TR')

      DROP TRIGGER reminder

      GO

      CREATE TRIGGER reminder

      ON titles

      FOR INSERT, UPDATE, DELETE

      AS

      EXEC master..xp_sendmail 'MaryM',

      'Don''t forget to print a report for the distributors.'

      GO

      C. 在 employee 和 jobs 表之间利用触发器业务准则

      由于 CHECK 约束只可以引用定义了列级或表级节制的列,表间的任何自律(在下例中是指工作准绳卡塔尔国都必得定义为触发器。

      下例成立叁个触发器,当插入或更新雇员职业等第 (job_lvls) 时,该触发器检查钦命雇员的办事等第(由此决定薪给卡塔尔是不是处于为该工作定义的限量内。若要得到确切的约束,必得援引jobs 表。

      USE pubs

      IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'employee_insupd' AND type = 'TR')

      DROP TRIGGER employee_insupd

      GO

      CREATE TRIGGER employee_insupd

      ON employee

      FOR INSERT, UPDATE

      AS

      /* Get the range of level for this job type from the jobs table. */

      DECLARE @min_lvl tinyint,

      @max_lvl tinyint,

      @emp_lvl tinyint,

      @job_id smallint

      SELECT @min_lvl = min_lvl,

      @max_lvl = max_lvl,

      @emp_lvl = i.job_lvl,

      @job_id = i.job_id

      FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id

      JOIN jobs j ON j.job_id = i.job_id

      IF (@job_id = 1) and (@emp_lvl <> 10)

      BEGIN

      RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)

      ROLLBACK TRANSACTION

      END

      ELSE

      IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)

      BEGIN

      RAISERROR ('The level for job_id:%d should be between %d and %d.',

      16, 1, @job_id, @min_lvl, @max_lvl)

      ROLLBACK TRANSACTION

      END

      D. 使用延缓名称拆解深入分析

      下例创立四个触发器以证实延迟名称深入分析。

      USE pubs

      IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig1' AND type = 'TR')

      DROP TRIGGER trig1

      GO

      -- Creating a trigger on a nonexistent table.

      CREATE TRIGGER trig1

      on authors

      FOR INSERT, UPDATE, DELETE

      AS

      SELECT a.au_lname, a.au_fname, x.info

      FROM authors a INNER JOIN does_not_exist x

      ON a.au_id = x.au_id

      GO

      -- Here is the statement to actually see the text of the trigger.

      SELECT o.id, c.text

      FROM sysobjects o INNER JOIN syscomments c

      ON o.id = c.id

      WHERE o.type = 'TR' and o.name = 'trig1'

      -- Creating a trigger on an existing table, but with a nonexistent

      -- column.

      USE pubs

      IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig2' AND type = 'TR')

      DROP TRIGGER trig2

      GO

      CREATE TRIGGER trig2

      ON authors

      FOR INSERT, UPDATE

      AS

      DECLARE @fax varchar(12)

      SELECT @fax = phone

      FROM authors

      GO

      -- Here is the statement to actually see the text of the trigger.

      SELECT o.id, c.text

      FROM sysobjects o INNER JOIN syscomments c

      ON o.id = c.id

      WHERE o.type = 'TR' and o.name = 'trig2'

      E. 使用 COLUMNS_UPDATED

      下例创立七个表:二个 employeeData 表和二个 auditEmployeeData 表。人力能源部的分子能够改进 employeeData 表,该表包蕴敏感的雇员薪给消息。假设修正了雇员的社会保障号码 (SSN)、每年薪金或银行帐户,则调换考察记录并插入到 auditEmployeeData 核实表。

      通过运用 COLUMNS_UPDATED() 功效,能够便捷测验对那些包涵敏感雇员音信的列所做的更动。唯有在试图检验对表中的前 8 列所做的改换时,COLUMNS_UPDATED() 才起效果。

      USE pubs

      IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

      WHERE TABLE_NAME = 'employeeData')

      DROP TABLE employeeData

      IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

      WHERE TABLE_NAME = 'auditEmployeeData')

      DROP TABLE auditEmployeeData

      GO

      CREATE TABLE employeeData (

      emp_id int NOT NULL,

      emp_bankAccountNumber char (10) NOT NULL,

      emp_salary int NOT NULL,

      emp_SSN char (11) NOT NULL,

      emp_lname nchar (32) NOT NULL,

      emp_fname nchar (32) NOT NULL,

      emp_manager int NOT NULL

      )

      GO

      CREATE TABLE auditEmployeeData (

      audit_log_id uniqueidentifier DEFAULT NEWID(),

      audit_log_type char (3) NOT NULL,

      audit_emp_id int NOT NULL,

      audit_emp_bankAccountNumber char (10) NULL,

      audit_emp_salary int NULL,

      audit_emp_SSN char (11) NULL,

      audit_user sysname DEFAULT SUSER_SNAME(),

      audit_changed datetime DEFAULT GETDATE()

      )

      GO

      CREATE TRIGGER updEmployeeData

      ON employeeData

      FOR update AS

      /*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1)) power(2,(3-1)) power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/

      IF (COLUMNS_UPDATED() & 14) > 0

      /*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/

      BEGIN

      -- Audit OLD record.

      INSERT INTO auditEmployeeData

      (audit_log_type,

      audit_emp_id,

      audit_emp_bankAccountNumber,

      audit_emp_salary,

      audit_emp_SSN)

      SELECT 'OLD',

      del.emp_id,

      del.emp_bankAccountNumber,

      del.emp_salary,

      del.emp_SSN

      FROM deleted del

      -- Audit NEW record.

      INSERT INTO auditEmployeeData

      (audit_log_type,

      audit_emp_id,

      audit_emp_bankAccountNumber,

      audit_emp_salary,

      audit_emp_SSN)

      SELECT 'NEW',

      ins.emp_id,

      ins.emp_bankAccountNumber,

      ins.emp_salary,

      ins.emp_SSN

      FROM inserted ins

      END

      GO

      /*Inserting a new employee does not cause the UPDATE trigger to fire.*/

      INSERT INTO employeeData

      VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32)

      GO

      /*Updating the employee record for employee number 101 to change the salary to 51000 causes the UPDATE trigger to fire and an audit trail to be produced.*/

      UPDATE employeeData

      SET emp_salary = 51000

      WHERE emp_id = 101

      GO

      SELECT * FROM auditEmployeeData

      GO

      /*Updating the employee record for employee number 101 to change both the bank account number and social security number (SSN) causes the UPDATE trigger to fire and an audit trail to be produced.*/

      UPDATE employeeData

      SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'

      WHERE emp_id = 101

      GO

      SELECT * FROM auditEmployeeData

      GO

      F. 使用 COLUMNS_UPDATED 测试 8 列以上

      假如必得测量试验影响到表中前 8 列以外的列的翻新时,必得运用 UBSTENVISIONING 函数测量试验由 COLUMNS_UPDATED 再次来到的方便的位。下例测量检验影响 Northwind.dbo.Customers 表中的第 3、第 5 或第 9 列的换代。

      USE Northwind

      DROP TRIGGER tr1

      GO

      CREATE TRIGGER tr1 ON Customers

      FOR UPDATE AS

      IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))

       power(2,(5-1)))

      AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))

      )

      PRINT 'Columns 3, 5 and 9 updated'

      GO

      UPDATE Customers

      SET ContactName=ContactName,

      Address=Address,

      Country=Country

      GO

    本文由新葡亰496net发布于网络数据库,转载请注明出处:触发器的分解

    关键词: