【问题标题】:'CREATE TRIGGER' must be the first statement in a query batch'CREATE TRIGGER' 必须是查询批处理中的第一条语句
【发布时间】:2017-07-10 14:54:42
【问题描述】:

我的脚本包含在开始事务和提交事务中。 我什至不能在中间使用 Go。 在脚本中,我想禁用一个触发器,然后想创建另一个触发器 但是当我同时执行这两个语句时,我得到了以下错误:

消息 111,级别 15,状态 1,第 6 行“CREATE TRIGGER”必须是查询批处理中的第一条语句。

我的代码是:

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;

【问题讨论】:

  • 需要看代码...
  • 简单切换顺序?
  • 我无法在此处发布代码。
  • CREATE TRIGGER 语句之前使用GO
  • 您遗漏了一些关键概念。事务通常不适用于 DDL 命令。它们专为数据完整性而设计。

标签: sql tsql sql-server-2012


【解决方案1】:

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

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;

【讨论】:

  • @priyanka 如果你想起飞 Begin and end,它仍然可以工作
  • @Priyanka 太棒了,感谢您提供反馈 :)
  • @Priyanka 您是否希望将其删除以保护数据?
  • 是的..你能帮我吗?
【解决方案2】:

插入“;”在最后一行!

作为

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; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多