wtorek, 14 lipca 2009

Uprawnienia w MSSQL-u do kolekcji parametrów

Dłubiąc dziś w SQL-u doszedłem co jest potrzebne do tego żeby kolekcja
parametrów w obiekcie typu ADODB.Parameters uzupełniła się sama po wpisaniu nazwy procedury. Trzeba mianowicie nadać prawo do wykonania EXECUTE userowi lub roli do obiektów
dbo.sp_ddopen oraz dbo.sp_sproc_columns.

uprawnienia dla użytkownika Guest

GRANT EXECUTE ON [dbo].[sp_ddopen] TO [guest]
GRANT EXECUTE ON [dbo].[sp_sproc_columns] TO [guest]
GO

uprawnienia dla roli Public

GRANT EXECUTE ON [dbo].[sp_ddopen] TO [public]
GRANT EXECUTE ON [dbo].[sp_sproc_columns] TO [public]
GO

Dzięki temu nie trzeba tworzyć kolekcji parametrów gdyż tworzy się sama

po podaniu nazwy procedury, dzięki czemu możemy podstawiać wartości bezpośrednio do istniejących elementów kolekcji

cmd.parameters("@par").value = "coś"

i są wszystkie parametry dostępne dla danej procedury łącznie z @return_value. Jak jest problem z uprawnieniami to tej kolekcji nie ma i trzeba sobie wszystkie parametry dodać ręcznie za pomocą konstrukcji:

cmd.Parameters.Append cmd.CreateParameter("@par", adChar, adParamInput, 50, "coś")

co jest niewygodne, lecz łatwe do osiągnięcia z poziomu kodu. Przydatne może być następujące zapytanie:

SELECT     S.name AS [Schema], PR.name, PA.name AS ParmName, T.name AS ParType, PA.max_length, PA.precision, PA.scale, PA.is_output, PA.has_default_value
FROM         sys.parameters AS PA INNER JOIN
sys.procedures AS PR ON PA.object_id = PR.object_id INNER JOIN
sys.schemas AS S ON PR.schema_id = S.schema_id INNER JOIN
sys.types AS T ON PA.system_type_id = T.system_type_id
WHERE     (PR.name = @RaportName) AND (S.name = @Schema)

Zwraca ono listę parametrów, które posiada procedura o nazwie zdefiniowanej w @RaportName i będącej w schemacie @Schema

Brak komentarzy:

Prześlij komentarz