删除后的T-SQL触发器
问题描述:
情况:假设您有一个组织,学生和课程购买的数据库,并且管理员想要为他们分配的课程获得退款。该软件默认不支持退款。您无权访问源代码,但可以在数据库中设置触发器。删除后的T-SQL触发器
数据库结构:
- 组织
- 的organization_ID
- account_balance
- 学生
- student_id数据
- 的organization_ID
- 购买
- student_id数据
- time_of_purchase
- amount_to_refund
总体思路是,当一个条目(或不止一个!)从购买取出表,触发器运行更新的的账户余额适当的组织。 amount_to_refund可以为零或零,因此在这种情况下不会退款。如果time_of_purchase超过30天前,也不应退款。
任何想法如何将其取消?我一直在建模它的另一个触发器,但是被UPDATE ... FROM ...语法抛出,我不能说我以前使用过。我看过MSDN,但我有点不知所措。
(可选)我还想将行插入另一个表(此处未记录),其中包含退款金额和组织ID。我只需要一个适合的大概想法,并且可以自己处理剩下的问题。
答
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
我调整它到我们的应用程序(我只是在这里给出了一个粗略的例子),它似乎工作,虽然我发现我不希望在删除的临时表中的数据。但这不在这个问题的范围之内。谢谢。 – Guttsy 2011-03-03 19:35:16
@Guttsy:很高兴能帮到你! – rsenna 2011-03-03 20:10:30