web-dev-qa-db-fra.com

Déclencheur pour mettre à jour un champ de date sur une table lors de la mise à jour d'une autre table

Je veux pouvoir mettre à jour une date déposée dans une table lorsqu'une autre table est mise à jour. J'ai les deux tables suivantes: Transdetails, Customers.

Dans la table Customers j'ai un champ appelé ZLastDateOfSale. Je veux ce champ mis à jour avec la date actuelle lorsque Transdetails.TradingDate est mis à jour par client.

Pouvez-vous s'il vous plaît aidez-moi à créer ce déclencheur?

Mon exemple est ci-dessous:

CREATE TRIGGER trg_LastSaleDate ON dbo.Transheaders
    AFTER UPDATE
AS
    IF UPDATE(TradingDate)
    BEGIN
        update dbo.Customers
            set dbo.Customers.ZLastSale = dbo.Transheaders.TradingDate
        from dbo.Customers
    END

Exemple mis à jour le 11/05/2014 :

CREATE TRIGGER trg_LastSaleDate ON dbo.Transheaders
    AFTER UPDATE
AS
    IF UPDATE(TradingDate)
    BEGIN
        UPDATE c
            SET ZLastSales = i.TradingDate
        FROM dbo.Customers AS c
          JOIN inserted AS i
            ON i.UniqueID = c.UniqueID     -- use the appropriate column for joining
          JOIN deleted AS d
            ON  i.AccountID = d.AccountID
            AND ( i.TradingDate <> d.TradingDate
               OR d.TradingDate IS NULL
                ) ;
    END ;

Bonjour,

Merci beaucoup pour votre contribution et votre réponse. J'ai changé votre exemple fournis, dirigé le script et cela a réussi, cependant, ce qu'il a fait était de mettre à jour la date de Zlastsale sur tous les clients de la date d'aujourd'hui. Ce champ doit être vide et seule la mise à jour ne passe à partir de maintenant lorsque la gâchette incendie. Ce champ ne doit être mis à jour que sur une vente d'un client.

De plus, lorsque j'ai testé la saisie d'une nouvelle transaction avec une date du 30/05/2014, il n'a pas mis à jour le champ ZlastSale requis. Il est affiché comme 11/05/2014 alors quelque chose ne fonctionne pas juste quelque part.

Mes identifiants pour chaque table sont:

Customers.UniqueID and Transheaders.AccountID

Merci encore pour votre aide.

1
Bill James

Vous devriez utiliser les tables inserted et deleted pseudo pour connaître les lignes pour lesquelles la colonne a été affectée par la gâchette - puis mettez à jour uniquement les lignes correspondantes dans la deuxième table:

CREATE TRIGGER trg_LastSaleDate ON dbo.Transheaders
    AFTER UPDATE
AS
    IF UPDATE(TradingDate)
    BEGIN
        UPDATE c
            SET ZLastSale = i.TradingDate
        FROM dbo.Customers AS c
          JOIN inserted AS i
            ON i.CustomerID = c.CustomerID     -- use the appropriate column for joining
          JOIN deleted AS d
            ON  i.TransheadersID = d.TransheadersID
            AND ( i.TradingDate <> d.TradingDate
               OR d.TradingDate IS NULL
                ) ;
    END ;
3
ypercubeᵀᴹ