none
DML触发器的问题 RRS feed

  • 问题

  • 看了半天DML触发器的AFTER和INSTEAD OF,两种激活模式,联机丛书翻译的太拗口了,各位师兄麻烦给我说说这两种激活模式的工作原理,或是那里有相关的资料(英文的联机丛书,已经看了,看了更晕),感谢了

    2009年4月2日 13:47

答案

  • 看了半天DML触发器的AFTER和INSTEAD OF,两种激活模式,联机丛书翻译的太拗口了,各位师兄麻烦给我说说这两种激活模式的工作原理,或是那里有相关的资料(英文的联机丛书,已经看了,看了更晕),感谢了

    after等同於for--是指定操作后再觸發

    instead of --操作前

    go

    如:
    instead of
    http://blog.csdn.net/roy_88/archive/2006/12/01/1424370.aspx

    go
    再簡單舉個例子
    use Tempdb
    go
    create table t(ID int identity primary key,num int)
    
    go
    if object_id('Tempdb..tr_t','tr') is not null
        drop trigger tr_t
    go
    create trigger tr_t on T
    after insert
    as
    update t
    set num=t.num*100
    from inserted i
        inner join t on i.ID=t.ID
    go
    
    insert t select 1
    
    go
    select * from t
    /*
    ID          num
    ----------- -----------
    1           100
    
    (1 個資料列受到影響)
    
    
    */
    --方法2:
    go
    truncate table t
    go
    if object_id('Tempdb..tr_t','tr') is not null
        drop trigger tr_t
    go
    create trigger tr_t on T
    instead of insert
    as
    insert t
    select num*100 from inserted--再次操作
    go
    insert t select 1
    go
    select * from t
    /*
    ID          num
    ----------- -----------
    1           100
    
    (1 個資料列受到影響)
    
    
    */
    go
    drop table t
    



    吳熹
    2009年4月3日 9:28
    版主
  • create table table1(col int check(col >1))

    Instead of: 只执行触发器本身,而不会执行触发触发器的sql语句。
    例如
    create trigger trigger1
    on table1
    instead of insert
    as
    select 1
    go
    这个触发器会在执行insert时会被触发,会执行select 1的操作。定义了trigger1以后,insert语句本身就不会被执行了,表table1的数据永远不会增加,所以称作instead of触发器.
    我们在table1中定义了一个check约束,要求col列>1。
    假设我们执行 insert table1 values(1) 这个语句是可以执行成功,虽然违背了check约束,并且trigger1也会被触发.


    After,只有所有引发触发器的sql语句执行成功后,trigger1才会被触发。
    例如
    create trigger trigger1
    on table1
    after insert
    as
    select 1
    go
    假设我们执行 insert table1 values(1) 这个语句会引发一个check约束的错误,会执行失败,所以trigger1也不会被触发束.

    如果我们执行insert table1 values(2) ,trigger1就会被触发了。
    勇敢的海上战士
    2009年4月2日 15:42
    版主

全部回复

  • create table table1(col int check(col >1))

    Instead of: 只执行触发器本身,而不会执行触发触发器的sql语句。
    例如
    create trigger trigger1
    on table1
    instead of insert
    as
    select 1
    go
    这个触发器会在执行insert时会被触发,会执行select 1的操作。定义了trigger1以后,insert语句本身就不会被执行了,表table1的数据永远不会增加,所以称作instead of触发器.
    我们在table1中定义了一个check约束,要求col列>1。
    假设我们执行 insert table1 values(1) 这个语句是可以执行成功,虽然违背了check约束,并且trigger1也会被触发.


    After,只有所有引发触发器的sql语句执行成功后,trigger1才会被触发。
    例如
    create trigger trigger1
    on table1
    after insert
    as
    select 1
    go
    假设我们执行 insert table1 values(1) 这个语句会引发一个check约束的错误,会执行失败,所以trigger1也不会被触发束.

    如果我们执行insert table1 values(2) ,trigger1就会被触发了。
    勇敢的海上战士
    2009年4月2日 15:42
    版主
  • 万分感谢
    2009年4月3日 2:08
  • 看了半天DML触发器的AFTER和INSTEAD OF,两种激活模式,联机丛书翻译的太拗口了,各位师兄麻烦给我说说这两种激活模式的工作原理,或是那里有相关的资料(英文的联机丛书,已经看了,看了更晕),感谢了

    after等同於for--是指定操作后再觸發

    instead of --操作前

    go

    如:
    instead of
    http://blog.csdn.net/roy_88/archive/2006/12/01/1424370.aspx

    go
    再簡單舉個例子
    use Tempdb
    go
    create table t(ID int identity primary key,num int)
    
    go
    if object_id('Tempdb..tr_t','tr') is not null
        drop trigger tr_t
    go
    create trigger tr_t on T
    after insert
    as
    update t
    set num=t.num*100
    from inserted i
        inner join t on i.ID=t.ID
    go
    
    insert t select 1
    
    go
    select * from t
    /*
    ID          num
    ----------- -----------
    1           100
    
    (1 個資料列受到影響)
    
    
    */
    --方法2:
    go
    truncate table t
    go
    if object_id('Tempdb..tr_t','tr') is not null
        drop trigger tr_t
    go
    create trigger tr_t on T
    instead of insert
    as
    insert t
    select num*100 from inserted--再次操作
    go
    insert t select 1
    go
    select * from t
    /*
    ID          num
    ----------- -----------
    1           100
    
    (1 個資料列受到影響)
    
    
    */
    go
    drop table t
    



    吳熹
    2009年4月3日 9:28
    版主