不知道
帮你MARK
好象差不多

解决方案 »

  1.   

    一样!都是后触发
    AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。
      

  2.   

    ...触发 SQL 语句中指定...这个"SQL  语句"指的是什么?
      

  3.   

    --  作者:zjsql2000
    --  发布时间:2004-7-27 17:18:42--  [原创]课堂笔记之 触发器--触发器类型:
    --1)for  <=> after:先执行触发触发器的条件语句,然后执行
    --触发器, 即后触发。
    --2)instead of:取消触发触发器的条件语句,执行触发器--触发条件:insert , update ,delete--逻辑表:只能在触发器中调用。两个逻辑表存放在内存中,
    --因此对这两个逻辑表的访问速度会很快。表结构和触发器所
    --依赖的表的结构完全相同
    --1)inserted:对触发器所依赖的表进行insert动作后
    --,所有新插入的数据全部存放在inserted逻辑表中
    --2)deleted:对触发器所依赖的表进行delete
    --动作后,所有删除掉的数据全部存放在deleted逻辑表中。
    --update动作系统在处理的时候分解为delete + insert,
    --因此执行update时,两个逻辑表中都会有数据,
    --deleted存放更新前的数据,inserted存放更新后的数据 
    select * from inserted  --X:不在触发器中调用
    --ex:
    insert into test (id ,name) values (9,\'www\')
    go
    create trigger t_test_insert
    on test
    for insert 
    as
    select \'t_test_insert\'
    select * from inserted
    update test set name=\'t_insert\' where id=9
    go
    select * from test
    --触发器是事务的一部分
    create trigger t_test_insert1
    on test
    for insert 
    as
    select \'t_test_insert1\'
    select * from inserted
    rollback tran
    update test set name=\'t_insert1\' where id=9
    go
    insert into test (id ,name) values (9,\'www\')
    --=>等价于
    begin tran
    insert into test (id ,name) values (9,\'www\')select \'t_test_insert\'
    select * from inserted
    update test set name=\'t_insert\' where id=9
    select \'t_test_insert1\'
    select * from inserted
    rollback tran
    update test set name=\'t_insert1\' where id=9commit tran
    --<=等价结束
    select * from test--设定同一条件触发器执行顺序
    sp_settriggerorder[@triggername = ] \'triggername\' 
        , [@order = ] \'value\' 
        , [@stmttype = ] \'statement_type\' 
    exec sp_settriggerorder \'t_test_insert\'
    ,\'Last\',\'insert\'
    exec sp_settriggerorder \'t_test_insert1\'
    ,\'First\',\'insert\'
    go
    insert into test (id ,name) values (9,\'www\')
    --=>等价于
    begin tran
    insert into test (id ,name) values (9,\'www\')
      

  4.   


    select \'t_test_insert1\'
    select * from inserted
    rollback tran
    update test set name=\'t_insert1\' where id=9--select \'t_test_insert\'
    --select * from inserted
    --update test set name=\'t_insert\' where id=9commit tran
    --<=等价结束
    select * from test
    --结果:只有触发器t_test_insert1执行
    --分析:因为指定了触发器的触发顺序,所以
    --t_test_insert1先执行,当执行完rollback tran语句
    --后,即标志触发触发器的语句insert into...是无效的,
    --所以不会写入数据文件,因此另外的一个触发器
    --t_test_insert没有执行。--ex:当一个教练挑选队员上场,当超出5名队员时应该给
    --出一个错误信息提示“目前已经选择了五名队员!”,
    --用触发器实现。
    create table member
    (id int,
    name varchar(20))
    go
    create trigger t_member_insert
    on member 
    for insert
    as
    select \'t_member_insert\'
    declare @count int 
    set @count=5
    if @count<(select count(*) from member)
      begin
        raiserror(\'目前已经选择了五名队员!不再在选择了。\',16,1)
        rollback transaction
      end 
    go
    insert into member (id,name) values (1,\'tom\')
    insert into member (id,name) values (2,\'tom1\')
    insert into member (id,name) values (31,\'tom2\')
    insert into member (id,name) values (21,\'tom3\')
    insert into member (id,name) values (13,\'tom4\')
    insert into member (id,name) values (16,\'tom5\')select * from member--触发器的enable & disable
    --ex:使test表上的t_test_insert,t_test_insert1暂时无效
    alter table test 
    disable trigger t_test_insert,t_test_insert1--all
    go
    insert into test (id ,name) values (1,\'tom\')
    select * from test
    --有效
    alter table test 
    enable trigger t_test_insert,t_test_insert1--all
    go
    --ex:删除触发器
    --删除表中的数据
    --1)delete from table_name:把表中数据删除,
    --同时命令及数据写入日志文件
    --2)trancate table table_name:把表中所有数据删除,
    --数据不写入日志文件
    create trigger t_test_delete
    on test
    for delete 
    as
    select \'t_test_delete\'
    go
    select * from test
    delete from test where id=9  --t_test_delete执行
    truncate table test  --t_test_delete不执行
    select * from test--EX: update trigger
    create trigger t_test_update_id
    on test
    after update
    as
    select \'t_test_update_id\'
    if update(id)
    begin
       raiserror(\'不能更新ID!\',10,1)
       rollback tran
    end
    go
    create trigger t_test_update_name
    on test
    after update
    as
    select \'t_test_update_name\'
    if update(name)
    begin
        select * from inserted
        select * from deleted
    end
    go
    insert into test values (1,\'tom\')
    update test set id=10 
    update test set name=\'ddd\'
    select * from test
      

  5.   

    for 和after是一样的for是以前版本的用法,
    而after是sql 2000的版本