SQL Alter Trigger висит - PullRequest
       27

SQL Alter Trigger висит

5 голосов
/ 12 марта 2012

Я пытаюсь изменить триггер обновления SQL Server 2000, но он зависает, зависает и зависает. Почему это может происходить и что я могу сделать, чтобы обойти это? Это длинный триггер, может быть, поэтому?

Код триггера длинный, но сокращенно:

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 =@OldItemNumber

--        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 =@OldItemNumber
          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 =@ItemNumber 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_:

1 Ответ

10 голосов
/ 12 марта 2012

Это заблокировано? Вы проверяли sysprocesses или sp_who2? Запустите следующее:

EXEC sp_who2;

(Запустите его из другого окна.)

Вы можете увидеть значение в столбце BlkBy для строки, которая соответствует SPID в исходном окне, где вы пытаетесь зафиксировать изменение. Затем вы можете посмотреть , что строки SPID в том же результате и посмотреть, что они работают. Чтобы определить, что именно вы можете использовать:

DBCC INPUTBUFFER(x);

(Заменить 'x' на SPID, который вызывает блокировку.)

Если вы решите, что этот сеанс одноразовый, вы можете запустить:

KILL x;

(Снова заменив 'x' на SPID.)

Однако, это должно быть последним средством - перед выпуском KILL Я предлагаю вам скорее разобраться, что это такое и почему это так долго. ALTER TRIGGER должно быть относительно быстрым действием DDL, но для него нужен эксклюзивный доступ к базовым объектам ... поэтому вы можете запланировать изменение на период обслуживания или, по крайней мере, на период относительно тихой активности.

...