【问题标题】:Disable Enable Trigger SQL server for a table为表禁用启用触发器 SQL 服务器
【发布时间】:2010-11-26 03:52:55
【问题描述】:

我想创建一个如下所示的 proc,但它有语法错误。 谁能指出问题所在?

Create PROCEDURE [dbo].[my_proc] AS

BEGIN

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

END

** Error Message : Incorrect syntax near 'ENABLE'.

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:
    USE [DatabaseName]
    GO
    
    -- HABILITAR TRIGGERS
    SELECT 'ALTER TABLE ['+ 
        ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
            + '].[' + OBJECT_NAME(T.[parent_id]) + '] ENABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
            FROM [sys].[triggers] AS T 
                INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
            WHERE T.[is_disabled] = 0 
                --AND DS.[name] = 'TableName'
    
    -- DESHABILITAR TRIGGERS
    SELECT 'ALTER TABLE ['+ 
        ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
            + '].[' + OBJECT_NAME(T.[parent_id]) + '] DISABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
            FROM [sys].[triggers] AS T 
                INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
            WHERE T.[is_disabled] = 0 
                --AND DS.[name] = 'TableName'
    

    【讨论】:

      【解决方案2】:

      我想分享一些对我有帮助的东西。创意归功于 @Siavash 和 @Shahab Naseer。

      我需要一些东西,我可以编写脚本禁用和重新启用特定表的触发器。我通常会尽量远离跳跳虎,但有时它们可​​能会很好用。

      我使用上面的脚本并添加了一个连接到 sysobjects,这样我就可以按表名过滤。此脚本将禁用表的一个或多个触发器。

      select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
      where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+ t.Name as EnableScript,*
      from sys.triggers t 
      INNER JOIN dbo.sysobjects DS ON DS.id = t.parent_id 
      where is_disabled = 0 AND DS.name = 'tblSubContact'
      

      【讨论】:

        【解决方案3】:

        如果你想直接从源代码执行 ENABLE TRIGGER :

        我们不能这样写:

        Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"
        

        相反,我们可以写:

        Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"
        

        【讨论】:

          【解决方案4】:

          下面是启用或禁用触发器的动态脚本。

          select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
          where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+
          Name as EnableScript,*
          from sys.triggers t 
          where is_disabled = 1
          

          【讨论】:

            【解决方案5】:

            在ENABLE TRIGGER OR DISABLE TRIGGER后换行写GO,示例:

            DISABLE TRIGGER dbo.tr_name ON dbo.table_name
            
            GO
            -- some update statement
            
            ENABLE TRIGGER dbo.tr_name  ON dbo.table_name
            
            GO
            

            【讨论】:

              【解决方案6】:

              前面的行需要以; 结尾,因为在SQL 中是DISABLEis not a keyword。例如:

              BEGIN
              ;
              DISABLE TRIGGER ...
              

              【讨论】:

              • 我更喜欢这个答案。它解决了问题并提供了解决方案而不是解决方法。虽然变通办法有其作用,但重要的是要了解发生错误的原因,而不是盲目地遵循没有上下文的变通办法。
              【解决方案7】:

              下面是最简单的方法

              试试代码

              ALTER TRIGGER trigger_name DISABLE

              就是这样:)

              【讨论】:

              • 不适用于 SQL Server > 2008 R2,问题是针对 MS SQL Server
              【解决方案8】:

              正如 Mark 所说,前面的语句应该以分号结尾。所以你可以使用:

              ; DISABLE TRIGGER dbo.tr_name ON dbo.table_name
              

              【讨论】:

                【解决方案9】:

                请改用以下命令:

                ALTER TABLE table_name DISABLE TRIGGER tr_name
                
                ALTER TABLE table_name ENABLE TRIGGER tr_name
                

                【讨论】:

                • 这适用于哪些版本的 SqlServer?不为我工作,而 DISABLE TRIGGER [dbo].[tr_name] on [schema].[table_name] 工作
                • 你的答案是正确的。但实际上@pang 语句不需要任何修复,而不是简单的;!我更喜欢使用ENABLE Trigger。它适用于从 2008 年开始的所有 SQL Server。
                • 如果您需要对数据库中的所有表进行操作,请使用:EXECUTE sp_msforeachtable "ALTER TABLE ? disable trigger ALL" go
                猜你喜欢
                • 2016-09-05
                • 1970-01-01
                • 2018-09-08
                • 2011-12-29
                • 2023-03-23
                • 2021-05-27
                • 2011-09-23
                • 1970-01-01
                • 2021-11-17
                相关资源
                最近更新 更多