2011-07-26 4 views
1

Tous les serveurs SQL sont SQL Server 2008 ....réplication et Triggers

J'ai une table qui est répliqué sur un centre de données. J'ai écrit un déclencheur AFTER INSERT & après mise à jour sur cette table. Lorsque les données sont répliquées sur la table, l'abonnement signale des erreurs

nom de la colonne

ou le nombre de valeurs fournies n'insère correspondre la table définition

pas que je peux manuellement les enregistrements & la gâchette fonctionne bien que lorsque la réplication tente d'insérer des enregistrements, je reçois le message ci-dessus. Voici mes déclencheurs ..

Je suis sûr que l'erreur émane de la gâchette, mais je suis à une perte pourquoi ...

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 

Répondre

4

Votre problème ici est

INSERT INTO tblReceivingHeaderStatus_1 

select ... 

ne fais pas ça. Au lieu de cela, spécifiez les colonnes que vous insérez dans e.g.

INSERT INTO tblReceivingHeaderStatus_1 
( fieldA, 
    FieldB 
    ... 
) 
SELECT ... 
+0

1 oui, absolument - ** toujours ** définir explicitement vos colonnes pour vous sauver des erreurs désagréables (quand les tables changent soudainement leur liste de colonnes ....) –

+0

Conrad ... J'ai pensé à faire cela, mais cela fonctionne quand j'insère les données manuellement, soit copier et passer dans la grille de la table ou une instruction d'insertion ... POURQUOI??? – larryr

0

Je parie que vous avez une colonne d'identité sur tblReceivingHeaderStatus_1 qui est marqué comme non pour la réplication ...