У меня есть 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?
XACT_ABORT_ON
, а затемTHROW
в триггере, который решает всю проблему. 30.01.2021