web-dev-qa-db-ja.com

別のテーブルが更新されたときに、あるテーブルの日付フィールドを更新するトリガー

別のテーブルが更新されたときに、あるテーブルに提出された日付を更新できるようにしたい。次の2つのテーブルがあります:TransdetailsCustomers

Customersテーブルには、ZLastDateOfSaleというフィールドがあります。 Transdetails.TradingDateが顧客ごとに更新されたときに、このフィールドを現在の日付で更新してください。

このトリガーの作成を手伝っていただけませんか?

私の例は以下です:

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

2014年5月11日更新の例:

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 ;

こんにちは、

ご意見、ご感想をありがとうございました。提供された例を変更してスクリプトを実行しましたが、成功しましたが、今日の日付ですべての顧客のZLastSale日付を更新することでした。このフィールドは空白である必要があり、トリガーが起動したときにのみ、今後更新されます。このフィールドは、顧客からの販売時にのみ更新する必要があります。

また、2014年5月30日の日付で新しいトランザクションの入力をテストしたところ、必須のZLastSaleフィールドが更新されませんでした。それは11/05/2014と表示されているため、どこかで正しく機能していません。

各テーブルのIDは次のとおりです。

Customers.UniqueID and Transheaders.AccountID

ご協力いただきありがとうございます。

1
Bill James

insertedおよびdeleted疑似テーブルを使用して、列がトリガーの影響を受けた行を見つけ、2番目のテーブルの関連する行のみを更新する必要があります。

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ᵀᴹ