我在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.
拖放并重新创建触发器并不能解决问题。