zoukankan      html  css  js  c++  java
  • MSSQL手札二 MSSQL的触发器

    触发器,就是在对表做DML操作的时候,触发一些其他的事件,触发器一般用在check约束更加复杂的约束上面,是一种特殊的存储过程,不可以被主动调用。

    语法如下:

    CREATE TRIGGER trigger_name
    ON { table | view }
    --加密,加密之后不可以修改,但是可以调用或者删除,具体怎么解密,网上有超长的一段SQL代码,大家可以百度一下SQL存储过程/触发器解密
    [ WITH ENCRYPTION ]
    {
    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }
    --指定应该再添加一个现有类型的触发器。 WITH APPEND 不能与 INSTEAD OF 触发器一起使用。
    --如果显式声明了 AFTER 触发器,则也不能使用该子句。for与after效果是一样的都是操作后触发,instead of是在操作的时候使用触发器内容替代的替代触发器 
    --仅当为了向后兼容而指定了 FOR 时(但没有 INSTEAD OF 或 AFTER)时,才能使用 WITH APPEND。
    -- 如果指定了 EXTERNAL NAME(即触发器为 CLR 触发器),则不能指定 WITH APPEND。
    [ WITH APPEND ]
    --微软对此的解释是:使用 NOT FOR REPLICATION 来控制约束、标识和触发器
    --在某些情况下,最好将复制拓扑中的用户活动与代理活动区别对待。 
    --例如,如果用户在订阅服务器上插入行且该插入满足表的检查约束,则复制代理在订阅服务器上插入该行时,可能不需要实施相同的约束。
    [ NOT FOR REPLICATION ]
    AS
    --在进行DML或者DDL后/前,做的一些操作。
    --但是不像oracle那样有一个before,如果想要在对表操作前触发,需要手动编写程序
    --大致思想就是,在插入的时候插入信息暂时存到了inserted/deleted临时表中,你去那里检索到了相关信息,
    --然后再和原表数据进行判断,如果没存在这个数据,就可以写一些插入前的操作了
    [ { IF UPDATE ( column )
    [ { AND | OR } UPDATE ( column ) ]
    [ ...n ]
    | IF ( COLUMNS_UPDATED ( ) updated_bitmask )
    column_bitmask [ ...n ]
    } ]
    sql_statement [ ...n ]
    }
    }

    基本的意思就是这样了,其中触发器对性能的影响还是有一些的,特别是数据量大的时候,所以要慎用,如果你想要优化数据库的话,最好使用一些约束。若果还有不完善的地方,还需要大神指正。

    EG:

  • 相关阅读:
    Mybatis 使用 mapper 接口规范的 一对一, 一对多,多对多映射
    mybatis mapper接口开发dao层
    使用 maven 搭建web开发基本架构
    mybatis dao 层开发简易版 非整合 spring
    mybatis 不整合spring 入门小例子
    spring+spring mvc+JdbcTemplate 入门小例子
    PythonCharm 配置本地反向代理激活
    Python 算法实现
    不写一行代码,绿色三层我也行
    pythonday
  • 原文地址:https://www.cnblogs.com/llcdbk/p/4276569.html
Copyright © 2011-2022 走看看