SQL Server 2016错误4920-更改表{TableName}禁用触发器{TriggerName}更改我的表和触发器名称

时间:2019-12-19 14:47:13

标签: sql-server triggers

我在SQL Server中遇到一个奇怪的问题(详细信息如下):当我尝试禁用/启用触发器时,它在MSG 4920上失败,指向现有但不同的触发器(但名称相似)数据库中的表格(名称也相似,但没有触发器)。

    SELECT @@VERSION;

    Microsoft SQL Server 2016 (SP2-CU6) (KB4488536) - 13.0.5292.0 (X64) 
        Mar 11 2019 23:19:30 
        Copyright (c) Microsoft Corporation
        Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 
            Datacenter 10.0  (Build 14393: ) (Hypervisor)

有人知道为什么会这样吗?

    SELECT  LEFT(OBJECT_NAME(parent_id), 20) as TableName
            , LEFT(Name, 40) as TriggerName
            , OBJECT_ID 
    FROM    sys.triggers 
    where   PARENT_ID = OBJECT_ID(N'dbo.ebHeaderSent');

    TableName            TriggerName                              OBJECT_ID
    -------------------- ---------------------------------------- -----------
    ebHeaderSent         ebHeaderSent_Insert                      240224852
    ebHeaderSent         trg_Write_ebHeaderSentDeleted_Record     1219444064
    SELECT  LEFT(OBJECT_NAME(parent_id), 20) as TableName
            , LEFT(Name, 40) as TriggerName
            , OBJECT_ID 
    FROM    sys.triggers 
    where   PARENT_ID = OBJECT_ID(N'dbo.ebHeaderSentDeleted');

    TableName            TriggerName                              OBJECT_ID
    -------------------- ---------------------------------------- -----------
    SELECT  LEFT(OBJECT_NAME(parent_object_id), 20) as TableName
            , LEFT(Name, 40) as TriggerName
            , OBJECT_ID
    FROM    sys.objects 
    WHERE   OBJECT_ID IN (240224852, 1219444064);

    TableName            TriggerName                              OBJECT_ID
    -------------------- ---------------------------------------- -----------
    ebHeaderSent         ebHeaderSent_Insert                      240224852
    ebHeaderSent         trg_Write_ebHeaderSentDeleted_Record     1219444064
    ALTER TABLE dbo.ebHeaderSent ENABLE TRIGGER ebHeaderSent_Insert;

    Msg 4920, Level 16, State 0, Line 1
    ALTER TABLE failed because trigger 'ebHeaderSentDeleted_Insert' 
                              on table 'ebHeaderSentDeleted' does not exist.

但是...

    ENABLE TRIGGER dbo.[ebHeaderSent_Insert] ON dbo.[ebHeaderSent];

    Command(s) completed successfully.

AND

    ALTER TABLE dbo.ebHeaderSent ENABLE TRIGGER trg_Write_ebHeaderSentDeleted_Record;

    Msg 4920, Level 16, State 0, Line 20
    ALTER TABLE failed because trigger 'trg_Write_ebHeaderSentDeletedDeleted_Record' 
                              on table 'ebHeaderSentDeleted' does not exist.

但是...

    ENABLE TRIGGER dbo.[trg_Write_ebHeaderSentDeleted_Record] ON dbo.[ebHeaderSent];

    Command(s) completed successfully.

其他编辑:

    DECLARE @strSQL nvarchar(max) = '';

    DROP TABLE IF EXISTS dbo.ebHeaderSent2;

    SELECT  * INTO dbo.ebHeaderSent2 FROM dbo.ebHeaderSent WHERE 1 = 2;

    SELECT  @strSQL = REPLACE(
                            REPLACE(Definition
                                    , 'ebHeaderSent', 'ebHeaderSent2')
                                    , 'ebHeaderSent2ID', 'ebHeaderSentID')
    FROM    sys.sql_modules SM
            JOIN sys.objects SO ON SO.object_id = SM.object_id
    WHERE   SM.OBJECT_ID = OBJECT_ID(N'ebHeaderSent_Insert')
            and SO.parent_object_id = OBJECT_ID(N'dbo.ebHeaderSent');

    EXEC (@strSQL);

    Command(s) completed successfully.
    SELECT  OBJECT_ID(N'ebHeaderSent2_Insert') as OBJ_ID;

    OBJ_ID
    -----------
    384225365
    ALTER TABLE dbo.ebHeaderSent2 DISABLE TRIGGER ebHeaderSent2_Insert;  

    Command(s) completed successfully.
    ALTER TABLE dbo.ebHeaderSent2 ENABLE TRIGGER ebHeaderSent2_Insert;

    Command(s) completed successfully.

拖放并重新创建触发器并不能解决问题。

0 个答案:

没有答案