Loading...
butoff avatar butoff 33 Точки

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
Module: C# DB 14/10/2017 15:50:09
ambiorix avatar ambiorix 640 Точки

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

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

0
butoff avatar butoff 33 Точки
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.