1

私は2つのテーブルを持っています

PaymentData
Ser   Customerid Totalpaid
1.    AGP001     2400
2.    AGP002     1000
3.    AGP003     1500

Receipt
Receipt#    Customerid  Paid
1.          AGP001      1200
2.          AGP001      1200

テーブルにトリガーを作成したいのですが、テーブルのフィールドReceiptを更新する挿入、更新、および削除操作でトリガーが起動します。新しい領収書レコードが挿入または更新されるたびに、その顧客のフィールドも更新されます。トリガーは次のようにする必要があります。totalpaidPaymentDatacustomeridtotalpaid

Update PaymentData.totalpaid = sum(Recipt.paid) 
where Receipt.customerID = PaymentData.customerID
4

3 に答える 3

0
CREATE TRIGGER [dbo].upd_PaymentData ON dbo.Receipt

FOR INSERT, UPDATE, DELETE

AS

IF @@ROWCOUNT = 0 return

SET NOCOUNT ON;

DECLARE @actionTable nvarchar( 10),

        @insCount int = (SELECT COUNT(*) FROM inserted),


        @delCount int = (SELECT COUNT(*) FROM deleted)

SELECT @actionTable = CASE WHEN @insCount > @delCount THEN 'inserted'

                           WHEN @insCount < @delCount THEN 'deleted' ELSE 'updated' END

IF @actionTable IN ('inserted', 'updated')

  BEGIN

    ;WITH cte AS

     (

      SELECT r.Customerid, SUM(r.Paid) AS NewTotalPaid,<strike> r.paymentDate</strike>

      FROM dbo.Receipt r  

      WHERE r.Customerid IN (SELECT i.Customerid FROM inserted i)

      GROUP BY r.Customerid

      )

      UPDATE p

      SET p.Totalpaid = c.NewTotalPaid

      <strike>SET p.lastpaymentDate = c.paymentDate</strike>

      FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid

  END

ELSE

  BEGIN

    ;WITH cte AS

     (

      SELECT d.Customerid, SUM(ISNULL(r.Paid, 0)) AS NewTotalPaid

      FROM deleted d LEFT JOIN dbo.Receipt r ON d.Customerid = r.Customerid

      GROUP BY d.Customerid

      )

      UPDATE p

      SET p.Totalpaid = c.NewTotalPaid

      FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid

  END  

タグ内に示されているように機能を追加しようとしましたが、エラーが発生して機能しません。両方のテーブルに 1 つのフィールドを追加するだけです。paymentdata追加lastpaymentdateで、追加receiptpaymentdatereceiptテーブルの挿入または更新時に、 にpaymentdata.lastpaymentdateも更新する必要がありreceipt.paymentdateます。

于 2013-03-19T14:05:54.160 に答える
0

次のようなトリガーが必要だと思います:

CREATE TRIGGER dbo.OnReceiptUpdate
   ON  dbo.Receipt
   AFTER INSERT,DELETE,UPDATE --operations you want trigger to fire on
AS 
BEGIN   
    SET NOCOUNT ON;

    DECLARE @customer_id VARCHAR(10)

    SET @customer_id= COALESCE
                        (
                            (SELECT customer_id FROM inserted), --table inserted contains inserted rows (or new updated rows)
                            (SELECT customer_id FROM deleted) --table deleted contains deleted rows

                        )

    DECLARE @total_paid DECIMAL

    SET @total_paid = 
            (
                SELECT SUM(paid) 
                FROM Receipt
                WHERE customer_id = @customer_id
            )

    UPDATE PaymentData
        SET total_paid = @total_paid            
    WHERE customer_id = @customer_id

    IF @@ROWCOUNT = 0               --if nothing was updated - you don't have record in PaymentData, so make it
        INSERT INTO PaymentData (customer_id, total_paid)
            VALUES (@customer_id, @total_paid)  

END
GO

覚えておいてください - 複数の更新/削除/挿入ではうまくいきません - これはあなたがそれを行う必要がある方法の単なる例です

于 2013-03-18T10:30:07.013 に答える
0

複数の更新、挿入、または削除でこのトリガーを試してください。

CREATE TRIGGER [dbo].upd_PaymentData ON dbo.Receipt
FOR INSERT, UPDATE, DELETE
AS
IF @@ROWCOUNT = 0 return
SET NOCOUNT ON;
DECLARE @actionTable nvarchar( 10),
        @insCount int = (SELECT COUNT(*) FROM inserted),
        @delCount int = (SELECT COUNT(*) FROM deleted)
SELECT @actionTable = CASE WHEN @insCount > @delCount THEN 'inserted'
                           WHEN @insCount < @delCount THEN 'deleted' ELSE 'updated' END
IF @actionTable IN ('inserted', 'updated')
  BEGIN
    ;WITH cte AS
     (
      SELECT r.Customerid, SUM(r.Paid) AS NewTotalPaid
      FROM dbo.Receipt r  
      WHERE r.Customerid IN (SELECT i.Customerid FROM inserted i)
      GROUP BY r.Customerid
      )
      UPDATE p
      SET p.Totalpaid = c.NewTotalPaid
      FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid
  END
ELSE
  BEGIN
    ;WITH cte AS
     (
      SELECT d.Customerid, SUM(ISNULL(r.Paid, 0)) AS NewTotalPaid
      FROM deleted d LEFT JOIN dbo.Receipt r ON d.Customerid = r.Customerid
      GROUP BY d.Customerid
      )
      UPDATE p
      SET p.Totalpaid = c.NewTotalPaid
      FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid
  END  
于 2013-03-18T11:34:59.063 に答える