繁体   English   中英

触发器,SQL SERVER 2008

[英]Trigger, SQL SERVER 2008

我有两张桌子

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

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

我想在Receipt表上创建一个触发器,并且触发器将在插入,更新和删除操作上触发,从而更新PaymentData表的totalpaid字段。 每次插入新的收据记录或针对某个customerid totalpaid更新新的收据记录时,该客户的totalpaid字段也将更新。 触发器应执行以下操作。

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

我想您需要一些触发器,例如:

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

请记住-它不能与多个更新/删除/插入配合使用-这只是您需要执行此操作的示例

尝试通过多次更新,插入或删除操作此触发器。

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

我尝试添加更多功能,如 tage所示, 但它给出了错误并且无法正常工作。 只需在两个表中添加一个字段。 paymentdata添加了lastpaymentdate ,在receipt添加了paymentdate 在插入或更新receipt表, paymentdata.lastpaymentdate也应该更新receipt.paymentdate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM