【问题标题】:SQL blocking with replication and triggers使用复制和触发器进行 SQL 阻塞
【发布时间】:2011-08-16 18:34:23
【问题描述】:

我有一个使用事务复制从服务器 A 复制到服务器 B 的表。我在服务器 B 上的表上也有一个 INSERT & UPDATE 触发器。当 SQL Server 代理复制数据时,存在由触发器引起的块。

下面是我的触发器。

USE [STOREMAIN]
GO
/****** Object:  Trigger [dbo].[UPD_tblReceivingHeaderStatus]    Script Date: 08/16/2011 13:28:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[UPD_tblReceivingHeaderStatus]
   ON [dbo].[tblReceivingHeader]
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @SeqNum numeric ,@Location numeric
    --get the seqnum & location from the inserted record
    select @SeqNum = i.SeqNum, @Location = i.Location
        from tblReceivingHeaderStatus D
    left join inserted i on D.Location = i.Location and D.SeqNum = i.SeqNum

    UPDATE tblReceivingHeaderStatus 
        SET
            AdjTax = inserted.AdjTax,
            AdjDeliveryFee = inserted.AdjDeliveryFee,
            AdjDiscount = inserted.AdjDiscount,
            AdjInvoiceTotal = inserted.AdjInvoiceTotal,
            AdjItemCount= inserted.AdjItemCount,
            AdjInvoiceInfo = inserted.AdjInvoiceInfo,
            InvoiceAdjReason = ISNULL(inserted.InvoiceAdjReason,''),
            PaidFlag = inserted.PaidFlag,
            StartDate = inserted.StartDate,
            CheckComments = inserted.CheckComments,
            POeMailSent =   case inserted.CheckComments
                                when '.' then 'P'
                                else ''
                            end,
            PONumber = inserted.PONumber,
            [Status] = inserted.[Status],
            MiscFlag2 = 'T'
        FROM 
            inserted
        WHERE 
            inserted.seqnum = tblReceivingHeaderStatus.seqnum AND 
            inserted.location = tblReceivingHeaderStatus.location
        ;

        --this assigns all inventory PO receivers to someone in pricing to approve
        update tblReceivingHeaderStatus  
            set NextApprover = 1
            from tblReceivingHeaderStatus
            left join apvendp on vmvend = vendornum 
        where 
            recdevice = 'P' and 
            status = '1' and 
            NextApprover <> 1 and 
            vminex = 'I'
            ;

END
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON

--------------------------------

USE [STOREMAIN]
GO
/****** Object:  Trigger [dbo].[INS_INTO_tblReceivingHeaderStatus]    Script Date: 08/16/2011 13:28:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[INS_INTO_tblReceivingHeaderStatus]
   ON [dbo].[tblReceivingHeader]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @SeqNum numeric ,@Location numeric
    --get the seqnum & location from the inserted record
    select @SeqNum = i.SeqNum, @Location = i.Location
        from tblReceivingHeaderStatus D
    left join inserted i on D.Location = i.Location and D.SeqNum = i.SeqNum;

        INSERT INTO storemain..tblReceivingHeaderStatus
        ( SeqNum, VendorNum, InvoiceNum, InvoiceTotal, ItemCount, InvoiceDate, Status, Location, AdjTax, AdjDeliveryFee, AdjDiscount, AdjInvoiceTotal, 
        AdjItemCount, AdjInvoiceInfo, Tax, DeliveryFee, Discount, ApprovedTime, ApprovedDate, ApprovedBy, InvoiceAdjReason, SentTo400, TimeDateSent, PaidFlag, 
        StartDate, CheckComments, DrayEnteredBy, NextApprover, PONumber, recDevice, SalesTaxFlag, FreightFlag, MiscFlag1, MiscFlag2, MiscFlag3, MiscChar1, 
        MiscChar2, MiscChar3, MiscNumber1, M

【问题讨论】:

    标签: sql-server-2008 triggers replication


    【解决方案1】:

    也许在您的查询中实现脏读可能会有所帮助?

    从某个表中选择 id、描述(nolock)

    也就是说,在您所处的环境中,脏读的影响并不是 100%,因此可能值得进一步调查。

    根据将数据从一台服务器复制到另一台服务器时所需的服务器负载,这些表可能会被锁定,因为如果正在运行足够大的查询,密集选择可能(我相信)会导致锁定。脏读在一定程度上缓解了这个问题,但是可能会产生一些后果,因为您可以获得陈旧的数据。是否值得尝试不同形式的复制?

    任何人/每个人,如果我错了,请纠正我并吠叫错误的树:)

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      相关资源
      最近更新 更多