有以下事务,在表config中TableVer小于2的情况下,创建两触发器,并更新TableVer值
但问题是,触发器创建语句只能是批处理的第一句话才能正确运行,所以没办法把两个语句同时放到一个if条件语句中执行
想请问有什么别的办法能实现吗? 不胜感激!
begin transaction/*设定当前版本(版本递增)*/
declare @NewVersion_20101012_1 int;
set @NewVersion_20101012_1 = 10;
/*第一次更新,版本可能为空*/
if (  @NewVersion_20101012_1 > (select TableVer from config where ID = 1 ) or 
 @NewVersion_20101012_1 > ISNULL((select TableVer from config where ID = 1),0) )
begin 
update config set TableVer = TableVer where ID = 1;
-- 加go的话编译出错
-- CREATE TRIGGER [dbo].[TriTable1Insert]
-- ON [dbo].[Nums]
-- FOR INSERT
-- AS
-- BEGIN
-- ...
-- END
--go
--CREATE TRIGGER [dbo].[TriTable1Insert2]
-- ON [dbo].[Nums]
-- FOR INSERT
-- AS
-- BEGIN
-- ...
-- END
/*更新版本*/
update config set TableVer = @NewVersion_20101012_1 where ID = 1;
end /*如果有出错就回滚*/
if(@@error<>0)   
begin   
rollback transaction   
end   
/*提交*/
commit  transaction

解决方案 »

  1.   

    关联这两个表 inserted/deleted 批量处理
      

  2.   

    哦,理解错误,这个需求要用execexec ('CREATE TRIGGER [dbo].[TriTable1Insert]....')
      

  3.   

    改用动态的alter proc pppp
    as 
    declare @s1 varchar(1001),@s2 varchar(1001) set @s1=' CREATE TRIGGER [dbo].[tr1]
    ON [dbo].tb1
    FOR INSERT
    AS
    BEGIN
    print ''a''
    END'  set @s2='
    CREATE TRIGGER [dbo].[tr2]
    ON [dbo].tb2
    FOR INSERT
    AS
    BEGIN
    print ''b''
    END' exec(@s1)
    exec(@s2)
    print 'c'
    go exec ppppselect name from sysobjects where xtype='tr'
    name
    --------------------------------------------------------------------------------------------------------------------------------
    tr1
    tr2(2 行受影响)drop trigger tr1
    drop trigger tr2