Transakcja w funkcji.

0

Witam, mam problem ponieważ nie moge stworzyć funkcji która posiada w swoim ciele transakcje. Środowisko Microsoft SQL 2008

CREATE FUNCTION f_zapomoga (@album INT, @semestr INT, @kwota FLOAT)
RETURNS INT
AS
BEGIN
DECLARE @tok_studiow INT;
DECLARE @ilosc_niepoz INT;
DECLARE @akt_status_stud_id INT;
DECLARE @sukces INT;
SET @sukces = 0

EXEC @tok_studiow = zwroc_tok_studiow @album, @semestr;

SELECT @akt_status_stud_id = status_stud_id FROM etap WHERE etap_id = @tok_studiow;

BEGIN TRY
BEGIN TRANSACTION 	
	UPDATE etap_id SET status_stud_id = 1 WHERE etap_id = @tok_studiow;
	INSERT INTO stypendium (etap_id, kwota, komunikat, rodzaj_styp_id, status_styp_id) VALUES (@tok_studiow, @kwota, 'Przyznano zapomogę', 5, 1);
	UPDATE etap_id SET status_stud_id = @akt_status_stud_id WHERE etap_id = @tok_studiow;
	SET @sukces = @sukces+1;
	COMMIT
END TRY	
BEGIN CATCH
--sprawdza czy wystapil blad
	IF @@TRANCOUNT > 0
	ROLLBACK		
	DECLARE @ErrorMessage nvarchar(4000),  @ErrorSeverity int;
	SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY();
	RAISERROR(@ErrorMessage, @ErrorSeverity, 1);
	END CATCH	
    
RETURN @sukces;

END;

i komunikat:

Msg 443, Level 16, State 14, Procedure f_zapomoga, Line 15
Invalid use of a side-effecting operator 'BEGIN TRY' within a function.
Msg 443, Level 16, State 15, Procedure f_zapomoga, Line 16
Invalid use of a side-effecting operator 'BEGIN TRANSACTION' within a function.
Msg 443, Level 16, State 15, Procedure f_zapomoga, Line 18
Invalid use of a side-effecting operator 'INSERT' within a function.
Msg 443, Level 16, State 15, Procedure f_zapomoga, Line 21
Invalid use of a side-effecting operator 'COMMIT TRANSACTION' within a function.
Msg 443, Level 16, State 14, Procedure f_zapomoga, Line 22
Invalid use of a side-effecting operator 'END TRY' within a function.
Msg 443, Level 16, State 14, Procedure f_zapomoga, Line 23
Invalid use of a side-effecting operator 'BEGIN CATCH' within a function.
Msg 443, Level 16, State 15, Procedure f_zapomoga, Line 26
Invalid use of a side-effecting operator 'ROLLBACK TRANSACTION' within a function.
Msg 443, Level 16, State 14, Procedure f_zapomoga, Line 29
Invalid use of a side-effecting operator 'RAISERROR' within a function.
Msg 443, Level 16, State 14, Procedure f_zapomoga, Line 30
Invalid use of a side-effecting operator 'END CATCH' within a function.

2

A czemu tworzysz funkcję, a nie procedurę składowaną?

Funkcje nie mogą zawierać transakcji, gdyż nie ma to sensu, bo nie mogą także zawierać żadnych operacji zmieniających stan bazy, takich jak insert czy update. Nie mogą też zawierać operacji try-catch.

0

dostałem takie polecenie, żeby zrobić funkcje z transakcją. Czyli mam rozumieć że się nie da ze względu na mechanizm działania bazy czy po prostu bo to nie ma sensu?

0

Taki jest mechanizm działania MSSQL, bo transakcje w funkcji nie mają sensu. Funkcja przyjmuje jakieś wartości i zwraca jakiś wynik, jest w swoim założeniu oderwana od danych przechowywanych w tabelach, więc nie są jej do niczego potrzebne transakcje.

Jesteś pewien, że tak brzmiało zadanie? Może miałeś zawrzeć funkcję w transakcji, a nie funkcję z transakcją? Albo miałeś zrobić procedurę z transakcją?

1 użytkowników online, w tym zalogowanych: 0, gości: 1