2012-03-12 54 views
3

我想改變一個SQL Server 2000更新觸發器,但它的掛起和掛起和掛起。爲什麼會發生這種情況,我該怎麼做才能解決這個問題?這是一個很長的觸發器,這可能是爲什麼?SQL變更觸發器掛

觸發代碼很長,但以下,簡稱:

ALTER TRIGGER [dbo].[UP_AL_ItemUPCs] ON [dbo].[AL_ItemUPCs] 

FOR UPDATE 

    AS 

    SET XACT_ABORT ON 

    Declare @vError varchar(254) 
    Declare @iUpdateCount int 

    Select @iUpdateCount = Count (D.UPCID) 
    From deleted D 

    If @iUpdateCount > 1 
    Begin 
     Raiserror ('This Table maintains AVANTI data ... mass updates cannot be done, yet' , 16 , 1)  
     Rollback 
     Goto Exit_ 
    End 

    Declare @iUpdateCheck int 
    Declare @OldItemNumber varchar(50) 
    Declare @ItemNumber varchar(50) 
    Declare @OldItemPrefix varchar(5) 
    Declare @ItemPrefix varchar(5) 
    Declare @OldItemCode varchar(25) 
    Declare @ItemCode varchar(25) 
    Declare @OldItemSuffix varchar(5) 
    Declare @ItemSuffix varchar(5) 
    Declare @vOldCustomerCode varchar(24) 
    Declare @vNewCustomerCode varchar(24) 

    If Update ([CustomerCode]) 
    Begin 
     Select @vOldCustomerCode = D.CustomerCode , @vNewCustomerCode = U.CustomerCode 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    End 
    Else 
    Begin 
     Select @vOldCustomerCode = U.CustomerCode , @vNewCustomerCode = U.CustomerCode 
      From deleted D 
     Inner Join AL_ItemUPCs U On D.UPCID = U.UPCID 
    End 

If Update (ItemPrefix) Or Update (ItemCode) Or Update (ItemSuffix) 
    Begin 

    If Update (ItemPrefix) 
     Begin 
     Select @OldItemPrefix = D.ItemPrefix , @ItemPrefix = U.ItemPrefix 
      From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     End 
    Else 
     Begin 
     Select @OldItemPrefix = U.ItemPrefix , @ItemPrefix = U.ItemPrefix 
      From deleted D 
     Inner Join AL_ItemUPCs U On D.UPCID = U.UPCID 
     End 

    If Update (ItemCode) 
     Begin 
     Select @OldItemCode = D.ItemCode , @ItemCode = U.ItemCode 
      From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     End 
    Else 
     Begin 
     Select @OldItemCode = IsNull (U.ItemCode , '') , @ItemCode = IsNull (U.ItemCode , '') 
      From deleted D 
     Inner Join AL_ItemUPCs U On D.UPCID = U.UPCID 
     End 

    If Update (ItemSuffix) 
     Begin 
     Select @OldItemSuffix= D.ItemSuffix , @ItemSuffix = U.ItemSuffix 
      From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     End 
    Else 
     Begin 
     Select @OldItemSuffix = IsNull (U.ItemSuffix , '') , @ItemSuffix = IsNull (U.ItemSuffix , '') 
      From deleted D 
     Inner Join AL_ItemUPCs U On D.UPCID = U.UPCID 
     End 

    Set @OldItemNumber = @OldItemPrefix + '-' + @OldItemCode 
    Set @ItemNumber = @ItemPrefix + '-' + @ItemCode 

    If @OldItemNumber = @ItemNumber Goto Skip_ItemUpdate 

     Set @iUpdateCheck = 0 

     Select @iUpdateCheck = @iUpdateCheck + IsNull (Count (recid) , 0) 
     From [AVANTISERVER\NCL_MASTER].AVANTI.dbo.InventoryTrans C 
     Where C.InvItemNumber [email protected] 

--  Inner Join deleted D On C.InvItemNumber = D.ItemPrefix + '-' + D.ItemCode + IsNull (D.ItemSuffix , '') 

     Select @iUpdateCheck = @iUpdateCheck + IsNull (Count (recid) , 0) 
     From [AVANTISERVER\NCL_MASTER].AVANTI.dbo.InventoryLocations C 
     Where C.LocItemNumber [email protected] 
      And C.LocQtyOnHand <> 0 

--  Inner Join deleted D On C.LocItemNumber = D.ItemPrefix + '-' + D.ItemCode + IsNull (D.ItemSuffix , '') 

     Select @iUpdateCheck = @iUpdateCheck + IsNull (Count (*) , 0) 
     From [AVANTISERVER\NCL_MASTER].AVANTI.dbo.JobItems C 
     Where C.Item_Code = @OldItemNumber 

--  Inner Join deleted D On C.Item_Code = D.ItemPrefix + '-' + D.ItemCode + IsNull (D.ItemSuffix , '') 

     If @iUpdateCheck > 0 
     Begin 
      Raiserror (' Item(s) cannot be updated due to associated AVANTI information ! ' , 16 , 1) 
      Rollback 
      Goto Exit_ 
     End 

    Update [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader Set [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.ItemNumber = @ItemNumber 
     From [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader AI 
     Where AI.ItemNumber = @OldItemNumber And AI.ColourStyle = @vOldCustomerCode 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'ItemNumber' , @ItemNumber , @OldItemNumber 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'ItemPrefix' , U.ItemPrefix , D.ItemPrefix 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.ItemPrefix <> U.ItemPrefix 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'ItemCode' , U.ItemCode , D.ItemCode 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.ItemCode <> U.ItemCode 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'ItemSuffix' , U.ItemSuffix , D.ItemSuffix 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.ItemSuffix <> U.ItemSuffix 


    Update AL_PO Set AL_PO.ItemCode = @ItemNumber 
     From deleted I 
     Inner Join AL_PO PO On I.UPCID = PO.UPCID 
     Where PO.Status <> 'Closed' 

    End 

Skip_ItemUpdate: 


    If Update ([CustomerCode]) 
    Begin 

    Update [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader Set [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.ColourStyle = U.CustomerCode 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     Inner Join [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader AI On AI.ItemNumber = @ItemNumber And AI.ColourStyle = @vOldCustomerCode 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'CustomerCode' , U.CustomerCode , D.CustomerCode 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.CustomerCode <> U.CustomerCode 

    End 

    If Update ([UPC]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'UPC' , U.UPC , D.UPC 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.UPC <> U.UPC 

    End 

    If Update ([ImageName]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'ImageName' , U.ImageName , D.ImageName 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.ImageName <> U.ImageName 

    End 

    If Update ([Description]) 
    Begin 

    Update [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader Set [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.[Description] = Cast (U.[Description] as varchar(60)), 
     [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.OldDescription = Cast (U.[Description] As varchar(60)) 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     Inner Join [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader AI On AI.ItemNumber = @ItemNumber And AI.ColourStyle = @vNewCustomerCode 

    Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'Description' , U.[Description] , D.[Description] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[Description] <> U.[Description] 

    End 

    If Update ([Box]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
Select D.UPCID , 'Update' , 'Box' , U.[Box] , D.[Box] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[Box] <> U.[Box] 

    End 

    If Update ([QtyPerBox]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'QtyPerBox' , U.[QtyPerBox] , D.[QtyPerBox] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[QtyPerBox] <> U.[QtyPerBox] 

    End 

    If Update ([TransFat]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'TransFat' , U.[TransFat] , D.[TransFat] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[TransFat] <> U.[TransFat] 

    End 

    If Update ([Length]) 
    Begin 

    Update [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader Set [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.Size1 = U.Length 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     Inner Join [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader AI On AI.ItemNumber = @ItemNumber And AI.ColourStyle = @vNewCustomerCode 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'Length' , U.[Length] , D.[Length] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[Length] <> U.[Length] 

    End 

    If Update ([Height]) 
    Begin 

    Update [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader Set [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader.Size2 = U.Height 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
     Inner Join [AVANTISERVER\NCL_MASTER].Avanti.dbo.InventoryHeader AI On AI.ItemNumber [email protected] And AI.ColourStyle = @vNewCustomerCode 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'Height' , U.[Height] , D.[Height] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[Height] <> U.[Height] 

    End 

--Similar blocks ommitted for brevity 

    If Update ([FileRevision]) 
    Begin 

     Insert Into AL_ItemUPCChanges (UPCID , ChangeType , FieldName , NewValue , OldValue) 
     Select D.UPCID , 'Update' , 'FileRevision' , U.[FileRevision] , D.[FileRevision] 
     From deleted D 
     Inner Join inserted U On D.UPCID = U.UPCID 
    Where D.[FileRevision] <> U.[FileRevision] 

    End 
Exit_: 
+3

它被封鎖了嗎?你檢查過'sysprocesses'或'sp_who2'嗎? – 2012-03-12 18:45:58

+0

@AaronBertrand看起來像一個帶有Runnable狀態的select語句阻止了我......不知道這是什麼意思 – MAW74656 2012-03-12 18:48:18

+1

是的。在'sp_who2'(來自不同的窗口)中,您可能會在原始窗口中的SPID的「BlkBy」列中看到一個值,您嘗試提交更改。不過,我認爲你的大綱觸發器「太長」也是有效的 - 地球上人們究竟如何維護所有的邏輯? – 2012-03-12 18:48:44

回答

8

它是否被封鎖?你檢查了sysprocessessp_who2?運行以下命令:

EXEC sp_who2; 

(從不同的窗口中運行它。)

您可能會在BlkBy列該行的是,在你想你的原來的窗口相匹配的SPID看到的值提交更改。然後你可以看看 SPID的行在同一個結果中,看看它們在運行什麼。要確定它到底是什麼,你可以使用:(更換「X」與SPID是造成阻塞)

DBCC INPUTBUFFER(x); 

如果確定本次會議是一次性的,你可以運行:

KILL x; 

(再次更換與SPID「X」。)

但是這應該是最後的手段 - 發行KILL之前,我建議你,而弄清楚什麼是,爲什麼它需要這麼長時間。 ALTER TRIGGER應該是一個相對較快的DDL操作,但它確實需要對基礎對象的獨佔訪問權限......所以您可能希望將您的修改安排在維護時段或至少一段相對安靜的活動期間。

+0

- 如何找出這個問題的拙劣總結。我完成了使用企業管理器來分析這些事情,它遠不如這種方法有幫助。 – MAW74656 2012-03-12 19:04:15

+0

- 哈哈!運行DBCC Inputbugger([spid])引起可運行的進程不做任何事情!但是那個不會阻止任何事情。 – MAW74656 2012-03-12 19:05:12

+0

是的,我總是用同樣的方式拼錯'INPUTBUFFER'。 – 2012-03-12 19:05:57