• SQL触发器


    /*
    触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。
    而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。
    当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
      |------------------|----------------------|----------------------|
      |对表的操作        |    Inserted逻辑表    |   Deleted逻辑表      |
      |------------------|----------------------|----------------------|
      |增加记录(insert)|    存放增加的记录    |   无                 |
      |------------------|----------------------|----------------------|
      |删除记录(delete)|    无                |   存放被删除的记录   |
      |------------------|----------------------|----------------------|
      |修改记录(update)|    存放更新后的记录  |   存放更新前的记录   |
      |------------------|----------------------|----------------------|
    
    触发器分类:
    1、DML( 数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生 DML 事件时将启用。DML事件是指在表或视图中对数据进行的 insert、update、delete 操作的语句。
    2、DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发生 DDL 事件时将启用。DDL事件是指在表或索引中的 create、alter、drop 操作语句。
    3、登陆触发器:是指当用户登录 SQL SERVER 实例建立会话时触发。如果身份验证失败,登录触发器不会触发。
    
    其中 DML 触发器比较常用,根据 DML 触发器触发的方式不同又分为以下两种情况:
    after 触发器(之后触发):其中 after 触发器要求只有执行 insert、update、delete 某一操作之后触发器才会被触发,且只能定义在表上。
    触发方式:for |after触发器(之后触发)、 instead of 触发器 (之前触发)、 触发器的类型(delete,insert,update)
    
    */
    
    --trigger on an insert, update, or delete statement to a table or view (DML trigger)
    create trigger [ schema_name . ]trigger_name 
    on { table | view } 
    [ with <dml_trigger_option> [ ,...n ] ]
    { for | after | instead of } { [ insert ] [ , ] [ update ] [ , ] [ delete ] } 
    as { sql_statement  [ ; ] [ ,...n ] | external name <method specifier [ ; ] > }
    
    
    
    --trigger on a create, alter, drop, grant, deny, revoke, or update statistics statement (DDL trigger)
    create trigger trigger_name 
    on { all server | database } 
    [ with <ddl_trigger_option> [ ,...n ] ]
    { for | after } { event_type | event_group } [ ,...n ]
    as { sql_statement  [ ; ] [ ,...n ] | external name < method specifier >  [ ; ] }
    
    <ddl_trigger_option> ::=
        [ encryption ]
        [ execute as clause ]
    
    <method_specifier> ::=
        assembly_name.class_name.method_name
    
    
    trigger on a logon event (logon trigger)
    create trigger trigger_name 
    on all server 
    [ with <logon_trigger_option> [ ,...n ] ]
    { for | after } logon  
    as { sql_statement  [ ; ] [ ,...n ] | external name < method specifier >  [ ; ] }
    <logon_trigger_option> ::=
        [ encryption ]
        [ execute as clause ]
    
    <method_specifier> ::=
        assembly_name.class_name.method_name
    
    
    
    
    
    --创建触发器
    create trigger people_tr
    on people
    for  insert
    as 
     ...
    go
    
    
    --修改触发器
    alter trigger people_tr
    on people
    for insert
    as 
     ...
    go
    
    
    --重命名people表
     exec sp_rename 'people_tr','people_tr'--旧名,新名
    --删除触发器
     drop trigger people_tr
    
    
    
     --利用sp_settriggerorder设置触发器执行顺序
    exec sp_settriggerorder 
    [ @triggername = ] '[ triggerschema. ] triggername',--要设置或更改其顺序的触发器的名称及其所属的架构。
    [ @order = ] 'value',--First--触发器被第一个触发。Last--触发器被最后一个触发。None--触发器以未定义的顺序触发。 
    [ @stmttype = ] 'statement_type'[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]--指定触发器的类型,可以是INSERT、UPDATE、DELETE、LOGON 或用于激发DDL触发器的DDL事件中列出的任何 Transact-SQL 语句事件。
    [ @namespace = { 'DATABASE' | 'SERVER' | NULL }]--默认值NULL,如果 triggername 是 DDL 或登录触发器,则指定所创建的 triggername 是具有数据库范围还是服务器范围。
    
    
    --查看数据库中所有的触发器
    select * from sysobjects where xtype='TR'
    --触发器状态is_disabled字段0为启用,1为禁用
    select * from sys.triggers
    --sp_helptrigger 用于查看触发器的属性 : 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。
    exec sp_helptrigger people, 'insert,update,delete'
    --查看触发器内容
    exec sp_helptext 'people_tr'
    --禁用触发器
    disable trigger people_tr on people;
    --启用触发器
    enable trigger people_tr on people;
  • 相关阅读:
    201521123038 《Java程序设计》 第五周学习总结
    201521123020 《Java程序设计》第4周学习总结
    201521123020 《Java程序设计》第3周学习总结
    201521123020《Java程序设计》第2周学习总结
    Java第十二周学习总结
    Java第十一周学习总结
    Java第十周学习总结
    Java第九周学习总结
    Java第八周学习总结
    Java第七周学习总结
  • 原文地址:https://www.cnblogs.com/tlmbem/p/10693377.html
Copyright © 2020-2023  润新知