【发布时间】:2021-05-02 23:22:29
【问题描述】:
我有 2 个存储过程,它们将更新 2 个表并激活 2 个触发器
CREATE PROCEDURE UP_CheckOut
@idBill INT,
@finalPrice INT
AS
UPDATE DBO.Bill
SET Status = N'Finished',
FinalPrice = @finalPrice
WHERE ID = @idBill
AND Status = N'Not Finished'
GO
CREATE PROCEDURE UP_ModifyBonusPoint_AfterCheckOut
@used INT,
@get INT,
@phoneNum VARCHAR(100)
AS
UPDATE DBO.CustomerAccount
SET BonusPoint = BonusPoint - @used + @get,
LastBuyDate = GETDATE()
WHERE PhoneNum = @phoneNum
GO
CREATE TRIGGER UT_BillCheckOut
ON dbo.Bill
FOR UPDATE
AS
BEGIN
DECLARE @check INT = 0
SELECT @check = COUNT(*)
FROM Inserted
WHERE Status = N'Finished'
IF @check > 0
EXEC UP_ModifyBonusPoint_AfterCheckOut -- I still stuck here because I don't know how to do
END
GO
CREATE TRIGGER UT_CustomerCheckOut
ON dbo.CustomerAccount
FOR UPDATE
AS
BEGIN
DECLARE @check INT = 0
SELECT @check = COUNT(*)
FROM Inserted
IF @check = 0
ROLLBACK UP_CheckOut -- I still stuck here because I don't know how to do
END
GO
我希望流程是这样的:
- 检查账单(更改状态)-> 触发其插入
- 如果成功,更新客户表(添加购买点)-> 触发其插入
- 如果不成功,则回滚所有工作。
但我不知道添加事务以进行回滚。还是有另一种方法可以在 SQL 中解决这个问题?
【问题讨论】:
-
它只回滚那个触发器(UT_CustomerCheckOut),但我希望它回滚所有,甚至是第一个过程(UP_CheckOut)
-
@HABO 如果它在
IF中使用,那么它被 通常优化为EXISTS,这里显然不是因为变量,但你是对的最好不要依赖它 -
@HưngPhạm 我鼓励你阅读when someone answers
标签: sql sql-server tsql triggers transactions