首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发器,SQL SERVER 2008

触发器,SQL SERVER 2008
EN

Stack Overflow用户
提问于 2013-03-18 16:49:00
回答 2查看 1.3K关注 0票数 1

我有两张桌子

代码语言:javascript
复制
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字段的insert、update和delete操作时触发。每次针对某个customerid插入或更新新的收货记录时,该客户的totalpaid字段也会更新。触发器应执行以下操作。

代码语言:javascript
复制
Update PaymentData.totalpaid = sum(Recipt.paid) 
where Receipt.customerID = PaymentData.customerID
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-18 18:30:07

我想你需要一些像这样的触发器:

代码语言:javascript
复制
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

请记住,这并不适用于多次更新/删除/插入--这只是你需要如何做的一个例子

票数 0
EN

Stack Overflow用户

发布于 2013-03-18 19:34:59

使用multiply updates、inserts或deletes尝试此触发器。

代码语言:javascript
复制
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  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15472698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档