[Home] Tranzacţii în T-SQL


Se dau două tabele, unul care conţine semne de carte al utilizatorilor (Bookmark):
CREATE TABLE Bookmark ([ID] INT PRIMARY KEY IDENTITY, UserID INT, Comment VARCHAR(100) NULL)

şi unul care conţine informaţiile privind partajarea semnelor de carte şi a comentariilor corespunzătoare
unor grupuri de utilizatori (BookmarkSharing):

CREATE TABLE BookmarkSharing
([ID] INT PRIMARY KEY IDENTITY, BookmarkID INT FOREIGN KEY REFERENCES Bookmark ([ID]), GroupID INT)

Se doreşte scrierea unei proceduri stocate pentru inserarea unor noi semne de carte în tabela Bookmark.
Atunci când se doreşte ca noul semn de carte să fie partajat unui grup de utilizatori inserarea înregistrării
noi în tabela BookmarkSharing să se facă în aceeaşi procedură stocată.


-------------------------------------------------
--  Exemplu: utilizarea tranzacţiilor în T-SQL
-------------------------------------------------

CREATE PROCEDURE spAddBookmark
    @ID AS INT OUTPUT,
    @UserID AS INT,
    @Comment AS VARCHAR (100) = NULL,
    @GroupID AS INT = NULL
AS

DECLARE @Bookmarks INT
DECLARE @err INT

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

------------------------------------------------------------------------------------------
--începutul tranzacţiei --------------------------------------------------------------------

BEGIN TRANSACTION

--insert în tabela de semne de carte
INSERT INTO Bookmark (UserID, Comment) VALUES (@UserID, @Comment)
SET @err = @@ERROR

IF @err <> 0
    BEGIN
        ROLLBACK TRANSACTION
        RETURN
@err
    END
ELSE
    BEGIN
        SELECT
@ID = @@IDENTITY
    END

--daca se doreste ca marcajul sa fie vizibil si pentru un grup de utilizatori (ceea ce înseamnă: @GroupID IS NOT NULL)

IF @GroupID IS NOT NULL
BEGIN
    INSERT INTO
BookmarkSharing (BookmarkID, GroupID) VALUES (@ID, @GroupID)
    SET @err = @@ERROR
    IF @err <> 0
        BEGIN
        ROLLBACK TRANSACTION
        RETURN
@err
    END
END

--încheierea tranzacţiei --------------------------------------------------------------------
COMMIT TRANSACTION
-------------------------------------------------------------------------------------------

SET NOCOUNT OFF
SET ANSI_WARNINGS ON
GO


Exemple de utilizare:

--pentru inserarea unui semn de carte al utilizaturului cu ID-ul 3 partajat grupului cu ID-ul 10
spAddBookmark null, 3, 'comentariu', 10

--pentru inserarea unui semn de carte al utilizaturului cu ID-ul 3 nepartajat
spAddBookmark null, 3, 'comentariu'