09.Triggers and Transactions_Problem_5 - Софтуерен университет

09.Triggers and Transactions_Problem_5 - Софтуерен университет

+ Нов въпрос
butoff avatar butoff 31 Точки

09.Triggers and Transactions_Problem_5

CREATE PROCEDURE usp_TransferMoney(@SenderId INT, @ReceiverId INT, @Amount DECIMAL(15,4))
AS
BEGIN
	BEGIN TRANSACTION
	EXEC dbo.usp_WithdrawMoney @SenderId, @Amount
	EXEC dbo.usp_DepositMoney @ReceiverId, @Amount
	COMMIT
END

Това решение минава в Judge, но не трябва!     задача 5:

Write stored procedure usp_TransferMoney(SenderId, ReceiverId, Amount) that transfers money from one account to another. Make sure to guarantee valid positive MoneyAmount with precision up to fourth sign after decimal point. Make sure that the whole procedure passes without errors and if error occurs make no change in the database. You can use both: “usp_DepositMoney”, “usp_WithdrawMoney” (look at previous two problems about those procedures).

Как да проверявам дали е минал WithdrawMoney или DepositMoney ? Може би с  IF(@@ROWCOUNT <> 1).

И може ли да се направи ROLLBACK  на  nested процедурата? Идеята е да се използват процедурите, но ако са неуспешни да се ROLLBACK  .

 Ако изтеглим пари от @SenderId, но @ReceiverId  не съществува, не може да се откаже процедурата за теглене.

0
C# DB Fundamentals 14/10/2017 15:50:09
ambiorix avatar ambiorix 641 Точки

Във вътрешните 2 процедури имаш ли пак транзакции и ROLLBACK при грешки? Би трябвало ако там нещо гръмне пак да си работи ROLLBACK независимо, че е вътрешна процедура.

Във всеки случай задачата може би наистина не е тествана сериозно.

0
butoff avatar butoff 31 Точки
CREATE OR ALTER PROCEDURE usp_TransferMoney(@SenderId INT, @ReceiverId INT, @Amount DECIMAL(15,4))
AS
BEGIN
	IF(    EXISTS(SELECT * FROM Accounts WHERE Id = @SenderId)
	   AND  EXISTS(SELECT * FROM Accounts WHERE Id = @ReceiverId))
	 BEGIN	
	  EXEC dbo.usp_WithdrawMoney @SenderId, @Amount	
	  EXEC dbo.usp_DepositMoney @ReceiverId, @Amount
	 END
	ELSE
	 BEGIN
	 RAISERROR('ERROR!',16,3)
	 END	
END

Като се добави проверка за наличност на ID работи, не може да се разчита само на процедурите.

0