Репликация и триггеры - PullRequest
1 голос
/ 27 июля 2011

Все SQL-серверы являются SQL Server 2008 ....

У меня есть таблица, которая реплицируется в центр обработки данных.Я написал триггер AFTER INSERT & AFTER UPDATE для этой таблицы.Когда данные реплицируются в таблицу, подписка сообщает об ошибках

имя столбца или количество предоставленных значений не соответствует определению таблицы

Я могу вручную вставить записи и триггерработает нормально, хотя, когда репликация пытается вставить записи, я получаю сообщение выше.Ниже приведены мои триггеры ..

Я уверен, что ошибка исходит от триггера, но я в недоумении, почему ...

AHIA,

LarryR ...

-- =============================================
-- Description: Updates tblReceivingHeaderStatus_1 
-- =============================================

create TRIGGER [dbo].[UPD_tblReceivingHeaderStatus_1]
   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

select @SeqNum = i.SeqNum, @Location = i.Location
from tblReceivingHeaderStatus_1 D
left join inserted i on D.Location = i.Location and D.SeqNum = i.SeqNum

UPDATE tblReceivingHeaderStatus_1 
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_1.seqnum AND 
    inserted.location = tblReceivingHeaderStatus_1.location ;

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

--update tblReceivingHeader to show the record has been

--updated in tblReceivingHeaderStatus_1

update tblReceivingHeader
set MovedToAs400 = 'Y'
where tblReceivingHeader.SeqNum = @SeqNum
  and tblReceivingHeader.Location = @Location ;

END


-- ==========================================================
-- Description: Insert records into tblReceivingHeaderStatus_1 
-- ==========================================================
create TRIGGER [dbo].[INS_INTO_tblReceivingHeaderStatus_1]
   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_1 D
left join inserted i on D.Location = i.Location and D.SeqNum = i.SeqNum;

INSERT INTO tblReceivingHeaderStatus_1
  select 
      SeqNum,VendorNum,InvoiceNum,InvoiceTotal,ItemCount,
      InvoiceDate,Status,Location,AdjTax,AdjDeliveryFee,AdjDiscount,
      AdjInvoiceTotal,AdjItemCount,isnull(AdjInvoiceInfo,''),Tax,
      DeliveryFee,Discount,ApprovedTime,ApprovedDate,ApprovedBy,
      InvoiceAdjReason,'N', GETDATE(),PaidFlag,StartDate,
      case CheckComments
         when '.' then 'P'
         else ''
      end,
      ' ', 0, PONumber, recDevice, '', '', '', 'T', '', '', '', '', 0, 0, 0, '', 
      msrepl_tran_version
FROM inserted;

-- update tblReceivingHeader to show the record has been
-- inserted into tblReceivingHeaderStatus_1
update tblReceivingHeader
set MovedToAs400 = 'Y'
where 
   tblReceivingHeader.SeqNum = @SeqNum
   and tblReceivingHeader.Location = @Location;
END

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Ваша проблема здесь

INSERT INTO tblReceivingHeaderStatus_1

select ...

Не делай этого. Вместо этого укажите столбцы, которые вы вставляете, например,

INSERT INTO tblReceivingHeaderStatus_1
(  fieldA, 
   FieldB
   ...
)
SELECT ...
0 голосов
/ 19 декабря 2011

Могу поспорить, у вас есть столбец идентификаторов на tblReceivingHeaderStatus_1, помеченный как не для репликации ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...