【问题标题】:T-SQL Trigger After Delete删除后的 T-SQL 触发器
【发布时间】:2011-03-03 16:29:13
【问题描述】:

情况:假设您有一个包含组织、学生和课程购买的数据库,并且管理员想要为他们分配的课程获得退款。该软件默认不支持退款。您无权访问源代码,但可以在数据库中设置触发器。

数据库结构:

  • 组织
    • organization_id
    • account_balance
  • 学生
    • student_id
    • organization_id
  • 购买
    • student_id
    • time_of_purchase
    • amount_to_refund

一般的想法是,当从 purchases 表中删除一个条目(或多个!)时,触发器会运行以更新相应的 帐户余额组织。 amount_to_refund 可以为 null 或零,因此在这种情况下不予退款。如果 time_of_purchase 超过 30 天,也不应退款。

任何想法如何解决这个问题?我一直在用另一个触发器对其进行建模,但被 UPDATE ... FROM ... 语法所抛弃,我不能说我以前用过。我看过 MSDN,但我有点不知所措。

或者,我还想将行插入另一个包含退款金额和组织 ID 的表(此处未记录)。我只需要大致了解它的适用范围,其余的可能我自己就可以处理。

【问题讨论】:

    标签: tsql triggers


    【解决方案1】:
    CREATE TRIGGER [dbo].[TrgPurchasesDelete] ON [dbo].[Purchases] FOR DELETE
    AS
    BEGIN
        UPDATE
            [dbo].[Organizations]
        SET
            account_balance = account_balance + DLTD.ammount_to_refund
        FROM
            [dbo].[Organizations] ORGA
            INNER JOIN [dbo].[Students] STDT ON
                STDT.organization_id = ORGA.organization_id
            INNER JOIN DELETED DLTD ON
                DLTD.student_id = STDT.student_id
        WHERE
            DLTD.ammount_to_refund > 0
            AND DLTD.time_of_purchase > DATEADD(DAY, -30, SYSDATE)
    END
    GO            
    

    【讨论】:

    • 我将它改编为我们的应用程序(我在这里只给出了一个粗略的例子)并且它似乎正在工作,尽管我在已删除的临时表中找到了我不期望的数据。不过,这超出了这个问题的范围。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多