zoukankan      html  css  js  c++  java
  • atitit...触发器机制 ltrigger mechanism sumup .的总结O8f

    atitit...触发器机制  ltrigger  mechanism sumup .的总结O8f

    1. 触发器的类型 1

    2. 实现原理 1

    3. After触发器 Vs Instead Of触发器 1

    4. DML 触发器 Vs DDL 触发器 3

    5. 触发器and事务 3

    6. 以下描写叙述三种常见触发器中事务的情况: 5

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

    8. 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。 7

    9. 表格记录复制and迁移SELECT INTO 和 INSERT INTO SELECT 8

    10. 參考 9

    1. 触发器的类型

    · DML触发器(DML Triggers) 

    · DDL触发器(DDL Triggers) 

    · 事务模式(Transaction modes) 

    · 显式事务(Explicit Transactions) 

    · 自己主动提交事务(Autocommit Transactions) 

    · 隐式事务(Implicit Transactions) 

    · 批范围的事务(Batch-scoped Transactions) 

    2. 实现原理

    3. After触发器 Vs Instead Of触发器 

                After 触发器将在处理触发操作(InsertUpdate 或 Delete)、Instead Of 触发器和约束之后激发。Instead Of是将在处理约束前激发,以替代触发操作。以下两张图描写叙述了After触发器和Instead Of触发器的运行先后顺序。

    作者::老哇的爪子Attilax艾龙,EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

                 

         图1                                                                             图2

    4. DML 触发器 Vs DDL 触发器

          DML 触发器在 InsertUpdate 和 Delete 语句上操作,能够作为After 触发器 和 Instead Of 触发器。

         DDL 触发器对 Create、Alter、Drop 和其它 DDL 语句以及运行 DDL 式操作的存储过程运行操作,仅仅可作为After触发器,不能Instead Of触发器。

         前面的内容,有描写叙述DML触发器中的After & Instead Of触发器内容,以下直接来看DDL的操作顺序:

         

         图3.

         从图3.能够知道,在DDL触发器中,是没有创建Inserted & Deleted过程的,我们通过简单的样例去測试下

    5.  触发器and事务

    看出,Update Contact触发tr_Contact触发器操作,触发器里面的Rollback Tran 动作导致了触发器外面的Update语句运行回滚,而Rollback Tran 语句后面的Begin Tran语句,主要是应用于保持整个事务的完整性。为了更能理解这一过程,我模拟了一个触发器中的事务開始结束过程。

    图4.

    在SQL Server 2005 和 SQL Server 2008上面,能够看到如图4.的效果。在低版本号的SQL Server上,可能会出现错误提示情况,无论怎样,在触发器外面,SQL Server都会Rollback Tran。以下我做个错误提示的样例。

    无论怎样,在触发器外面,SQL Server都会Rollback Tran。以下我做个错误提示的样例。

    在触发器里面没有Begin Tran语句动作,触发器外面也能回滚操作。这里我们能够通过查询表数据和@@Trancount来推断。

             事实上,上面的样例,Update语句,是以自己主动提交事务(Autocommit Transactions)模式 開始运行的,触发器里Rollback Tran后面,无论有没有Begin Tran ,最后都会事务都会交回给SQL Server自己主动提交事务管理。当然,在DML触发器中,你能够使用显式事务(Explicit Transactions),或开启隐式事务(Implicit Transactions) 来控制,当然你也能够应用于批范围的事务(Batch-scoped Transactions) 中。这里,我通过开启隐式事务(Implicit Transactions) 的样例来说,触发器与事务的关系。

    这里,你是否发现一个非常有意思的问题,在触发器理,运行Insert ContactHIST之前,@@Trancount=1,运行Insert后,@@Trancount还是为1,触发器外面Update Contact后,@@Trancount就变成了2,。这里能够理解成,你在触发器里面,发出一个Begin Tran,那么SQL Server 就会创建一个嵌套事务。当你在触发器里面,在Rollback Tran后面屏蔽掉Begin Tran,就会出现错误3609,如,

    6. 以下描写叙述三种常见触发器中事务的情况:

    图5.                                                                             图6.                                                                           图7.

    图5.描写叙述在触发器中含有Begin Tran …… Commit Tran的情况,

    图6.描写叙述在触发器中含有Save Tran savepoint_name …… Rollback Tran savepoint_name 的情况,触发器中的Rollback Tran 仅仅会回滚指定的保存点,不会影响到触发器外面的Commit Tran Or Rollback Tran操作。

    图7.描写叙述在触发器中含有Rollback Tran的情况,无论触发器里面有没有Begin Tran,都会出现错误3609,中止批处理。

        注:DDL触发器操作可 以触发器中回滚操作,能够使用命令如Rollback,但严重错误可能会导致整个事务自己主动回滚。不能回滚发生在 DDL 触发器正文内的 Alter Database事件。在触发器中使用Rollback … Begin Tran 可能会导致意想不到的结果,在没有确认和測试情况下,请不要随便在触发器中直接使用Rollback …Begin Tran处理方式.特别是Create Database事件,在SQL Server 2008和SQL Server 2005环境下,产生的结果不同。

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

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

    8. 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。

    这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数 据库中。并且两张表的都是仅仅读的,仅仅能读取数据而不能改动数据。这两张表的结果总是与被改触发器应用的表的结构同样。当触发器完毕工作后,这两张表就会被 删除。Inserted表的数据是插入或是改动后的数据,而deleted表的数据是更新前的或是删除的数据。

    对表的操作

    Inserted逻辑表

    Deleted逻辑表

    添加记录(insert)

    存放添加的记录

    删除记录(delete)

    存放被删除的记录

    改动记录(update)

    存放更新后的记录

    存放更新前的记录

        Update数据的时候就是先删除表记录,然后添加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触 发器本身就是一个事务,所以在触发器里面能够对改动数据进行一些特殊的检查。假设不满足能够利用事务回滚,撤销操作。

    9. 表格记录复制and迁移SELECT INTO 和 INSERT INTO SELECT

    Insert是T-sql中经常使用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这样的形式的在应用程序开发中不可缺少。但我们在开发、測试过程中,经常会遇到须要表复制的情况,如将 一个table1的数据的部分字段拷贝到table2中,或者将整个table1拷贝到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

    SELECT INTO  要新的建立表格...INSERT INTO SELECT 能够存在的表格insert 数据..所以,还是.INSERT INTO SELECT  使用的经常使用...

    ALTER TRIGGER [dbo].[trg_inst]

       ON   [dbo].[t_mb_weixinuser]

       AFTER  INSERT  

    AS 

    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

     Insert into wechatuhstry(userid, [subscribe] ,[openid] ,[subscribe_time],[groupid] ,[createTime] ,[updateTime] ,nickname)   select  userid,[subscribe] ,[openid] ,[subscribe_time],[groupid] ,[createTime] ,[updateTime] ,nickname from inserted;

        -- Insert statements for trigger here

     

    END

    #----最佳实践

    copy2表格的id自己主动incream最好关闭..中间id一样..分享一样的主键.

    text类型的不能copy,仅仅好指定字段了...

    #---rest风格安全能够多次复制

     Insert into wechatuhstry 

     select top 100000 * from t_mb_weixinuser  where UserID not in

      (select UserID from wechatuhstry)

    10. 參考

    SQL Server 触发器 - hoojo - 博客园.htm

    了解SQL Server触发器及触发器中的事务 - OK_008 - 博客园.htm

    我要啦免费统计
  • 相关阅读:
    数据结构-图
    web.xml的运行顺序
    如何把自己打造成技术圈的 papi 酱
    也谈http中get和post
    手机充电速度及电池使用
    web项目Log4j日志输出路径配置问题
    JAVA模块化
    关于web安全
    Struts2中通配符
    2016第14周一
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4009264.html
Copyright © 2011-2022 走看看