2017-06-30 220 views
0

我的脚本被封装在开始事务和提交事务中。 我甚至不能使用Go inbetween。 在我想禁用一个触发器,然后脚本要创建另一个 但是,当我同时执行两个语句,我得到了FOLL错误:'CREATE TRIGGER'必须是查询批次中的第一条语句

Msg 111, Level 15, State 1, Line 6 'CREATE TRIGGER' must be the first statement in a query batch.

我的代码是:

 

BEGIN TRY 
BEGIN TRANSACTION 

DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] ON [dbo].[Beneficiary] 

CREATE TRIGGER [dbo].[trg_Beneficiary_After_Update1] ON [dbo].[Beneficiary] FOR UPDATE AS 
BEGIN 
INSERT INTO [dbo].[Beneficiary_History]([Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],[Action_Flag],[Benef_No],[Original_Date],[Provider_Id],[Create_Date]) 
SELECT [Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],'U',[Benef_No],[Create_Date],[Provider_Id],GETDATE() FROM DELETE 
PRINT 'AFTER Beneficiary Table UPDATE1 trigger fired.' 
END 

UPDATE [dbo].[Beneficiary] SET [Benef_No] = REPLACE (Benef_No, +2120, ++212) WHERE Benef_No like '+2120%' 

DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update1] ON [$(oltpdb)].[dbo].[Beneficiary] ; 

ENABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] ON [$(oltpdb)].[dbo].[Beneficiary] 

end 
COMMIT TRANSACTION                  END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH; 
+2

需要看到代码... – VDK

+0

简单地切换顺序? – jarlh

+0

我无法在此发布代码。 – Priyanka

回答

2

@Priyanka,您可以使用动态SQL创建触发器以嵌入到存储过程中。使用分号将以批处理方式执行脚本。但是,在这种情况下,我相信在您存储的proc之外创建触发器总是最佳做法。测试这个脚本,让我知道它是否有效。

BEGIN TRY 
    BEGIN TRANSACTION 

    BEGIN 
      ; 

     DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] 
      ON [dbo].[Beneficiary]; 

     DECLARE @SQL VARCHAR(MAX); 

     SET @SQL = 
      'CREATE TRIGGER [dbo].[trg_Beneficiary_After_Update1] ON [dbo].[Beneficiary] FOR UPDATE AS 
       BEGIN 
      INSERT INTO [dbo].[Beneficiary_History]([Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],[Action_Flag],[Benef_No],[Original_Date],[Provider_Id],[Create_Date]) 
      SELECT [Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],''U'',[Benef_No],[Create_Date],[Provider_Id],GETDATE() FROM DELETED 
      PRINT ''AFTER Beneficiary Table UPDATE1 trigger fired'' END' 

     EXEC (@SQL); 

     UPDATE [dbo].[Beneficiary] 
     SET [Benef_No] = REPLACE(Benef_No, + 2120, + + 212) 
     WHERE Benef_No LIKE '+2120%'; 

     DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update1] 
      ON [$(oltpdb)].[dbo].[Beneficiary]; 

     ENABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] 
      ON [$(oltpdb)].[dbo].[Beneficiary]; 
    END 

    COMMIT TRANSACTION; 
END TRY 

BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH; 
+0

@priyanka如果你想起飞,它仍然会工作 –

+0

它的工作......非常感谢你@B房子:) – Priyanka

+0

@Priyanka这很棒,谢谢您提供反馈:) –

0

插入“;”在最后一行!

由于

BEGIN TRY 
BEGIN TRANSACTION 

DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] ON [dbo].[Beneficiary]; 

CREATE TRIGGER [dbo].[trg_Beneficiary_After_Update1] ON [dbo].[Beneficiary] FOR UPDATE AS 
BEGIN 
INSERT INTO [dbo].[Beneficiary_History]([Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],[Action_Flag],[Benef_No],[Original_Date],[Provider_Id],[Create_Date]) 
SELECT [Beneficiary_Id],[Customer_Id],[Beneficiary_Type],[Nick_Name],[Rib_Key],'U',[Benef_No],[Create_Date],[Provider_Id],GETDATE() FROM DELETE 
PRINT 'AFTER Beneficiary Table UPDATE1 trigger fired.' 
END 

UPDATE [dbo].[Beneficiary] SET [Benef_No] = REPLACE (Benef_No, +2120, ++212) WHERE Benef_No like '+2120%' 

DISABLE TRIGGER [dbo].[trg_Beneficiary_After_Update1] ON [$(oltpdb)].[dbo].[Beneficiary] ; 

ENABLE TRIGGER [dbo].[trg_Beneficiary_After_Update] ON [$(oltpdb)].[dbo].[Beneficiary] ; 

end 
COMMIT TRANSACTION                  END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH; 
相关问题