Zamierzasz utworzyć procedurę, którą będzie uruchamiał pewien nowy użytkownik. Tworzymy więc konto użytkownika:
USE TestGO CREATE USER TestUser WITHOUT LOGIN
GO
Teraz dla użytkownika utworzymy procedurę i nadamy uprawnienia dla tego użytkownika:
CREATE PROCEDURE TestItAS
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 1The EXECUTE permission was denied on the object 'TestIt’, database 'Test’, schema 'dbo’.
Potem przestaję być użytkownikiem TestUser:
REVERTAle 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).