Procedura składowana – BEGIN i END

11-lis-2011

Zamierzasz utworzyć procedurę, którą będzie uruchamiał pewien nowy użytkownik. Tworzymy więc konto użytkownika:

USE Test
GO
CREATE USER TestUser WITHOUT LOGIN
GO

Teraz dla użytkownika utworzymy procedurę i nadamy uprawnienia dla tego użytkownika:

CREATE PROCEDURE TestIt
AS
BEGIN
 SELECT file_id, name
 FROM sys.database_files
END
GRANT EXECUTE ON TestIt TO TestUser
GO

Uwaga! Uruchamiając ten kod zaznacz go w całości (nie kawałek po kawałku).

Sprawdźmy działanie procedury. Najpierw 'staję się użytkownikiem:

EXECUTE AS USER = 'TestUser’

A potem uruchamiam jako ten uzytkownik procedurę:

EXECUTE dbo.TestIt
Msg 229, Level 14, State 5, Procedure TestIt, Line 1
The EXECUTE permission was denied on the object 'TestIt’, database 'Test’, schema 'dbo’.

Potem przestaję być użytkownikiem TestUser:

REVERT

Ale co oznacza ten dziwny komunikat? Przecież procedura nie miała nadawać nikomu żadnych uprawnień, tylko wyświetlić rekordy!? Badamy zatem sprawę dalej. Teraz uruchomię procedurę jako jej właściciel:

EXECUTE dbo.TestIt
(2 row(s) affected)
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.

Procedura zadziałała, ale znowu jest błąd.

Okazuje się, że jeżeli tworząc procedurę przed naciśnięciem F5 (lub Uruchom) zaznaczasz coś więcej jeszcze za słowem END, to te kolejne polecenia (w tym przykładzie nadanie uprawnień do tej procedury), wchodzą w skład procedury. Zaskakujące, a jednak. Przekonasz się sprawdzając tekst procedury (GetDefinition lub sp_helptext).

Komentarze są wyłączone

Autor: Rafał Kraik