2012-10-31 21 views
7

Używam programu SQL Server 2008 R2. Muszę wyświetlić listę wszystkich procedur przechowywanych, które użytkownik bazy danych (MYUSER) ma uprawnienia do wykonywania.Znajdowanie procedur przechowywanych z uprawnieniami do wykonywania

Również muszę wymienić się jakie są procedury składowane, że użytkownik nie posiada uprawnienia do wykonywania - ale przeczytałam scenariusz procedury przechowywanej

Czy istnieje instrukcja SQL lub funkcja pomocnika do tych celów?

REFERENCJE:

  1. Granting execute permission on all stored procedures in a certain database

Odpowiedz

10

Zastosowanie HAS_PERMS_BY_NAME:

select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute, 
    has_perms_by_name(name, 'OBJECT', 'VIEW DEFINITION') as has_view_definition 
from sys.procedures 
+0

mogę oglądać skrypt przechowywanej proc edure za pomocą "Script Stored Procedure As" -> "Create To"; ale has_view_definition nadchodzi jako "0". Jak możemy to poprawić? – Lijo

+1

Czy można uruchomić ['SELECT * FROM sys.fn_my_permissions ('', 'OBJECT')'] (http://msdn.microsoft.com/en-us/library/ms176097.aspx) i zamieścić tutaj wynik? –

+1

BTW, moje zapytanie nie obsługuje procedur w innym schemacie, nie dbo. Możesz to łatwo naprawić samodzielnie. –

5

HAS_PERMS_BY_NAME, stosowany w kontekście scenariusza przewidzianego w pierwszej odpowiedzi, zapewni pożądanego rezultatu tylko jeśli jesteś podłączony jako "MYUSER" od tej funkcji

"Ocenia skutecznej zgody bieżącego użytkownika"

5

Aby sprawdzić uprawnienia do innego użytkownika, użyj tego:

use my_db; 
EXECUTE AS user = 'my_user' 
SELECT SUSER_NAME(), USER_NAME(); 
select name, 
    has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute 

from sys.procedures 
where name = 'myprocname'; 
revert; 

Works dla mojego SQL Server 2012.

4

Odpowiedź od Knb nie działa dla mnie z powodu brakujących uprawnień. (Roztwór do innego użytkownika niż obecnie)

Nie można wykonać jako główna baza danych, ponieważ główny „mój user” nie istnieje, ten rodzaj kapitału nie może być podszywa, albo nie mają pozwolenie.

Ten answer pokazuje, jak uzyskać listę procedur składowanych na których dany użytkownik bazy danych („mój user”) posiada uprawnienie EXECUTE wyraźnie przyznana:

SELECT [name] 
FROM sys.objects obj 
INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
WHERE obj.[type] = 'P' -- stored procedure 
AND dp.permission_name = 'EXECUTE' 
AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
AND dp.grantee_principal_id = 
    (SELECT principal_id 
    FROM sys.database_principals 
    WHERE [name] = 'my user') 

zmodyfikowałem go w następujący sposób, aby uzyskać lista muszę:

SELECT [name] 
FROM sys.procedures 
WHERE [name] NOT IN 
    (SELECT [name] 
    FROM sys.objects obj 
    INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id 
    WHERE obj.[type] = 'P' -- stored procedure 
    AND dp.permission_name = 'EXECUTE' 
    AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT 
    AND dp.grantee_principal_id = 
     (SELECT principal_id 
     FROM sys.database_principals 
     WHERE [name] = 'my user')) 

Testowane na Microsoft SQL Server 2008 R2

Powiązane problemy