2015-04-29 2 views
2

Как получить все пользовательские группы/роли пользователей, которые имеют разрешение на выполнение для определенной хранимой процедуры в MS SQL Server 2008 R2.Как получить пользователей, у которых есть разрешение на выполнение для конкретного sp на сервере sql?

+0

Я думаю, что вы можете начать здесь: SELECT * FROM sys.fn_builtin_permissions ('EX'); – PeterRing

+0

Вы также можете найти полезную информацию: http: //stackoverflow.com/questions/13152329/finding-stored-procedures-having-execute-permission – PeterRing

+0

Не повезло @PeterRing, это [SELECT * FROM sys.fn_builtin_permissions ('EX ')] возвращает 0 строк :( –

ответ

1

Запуск трассировки профайлера в SSMS-активности показывает, что SSMS собирает эти данные для окна свойств хранимой процедуры со следующим запросом, который вы, вероятно, могли бы настроить для своих целей (обратите внимание, что значения для двух последних параметров должны быть настроены рассмотреть процедуру вы заинтересованы в):

exec sp_executesql N'SELECT 
grantee_principal.name AS [Grantee], 
CASE grantee_principal.type WHEN ''R'' THEN 3 WHEN ''A'' THEN 4 ELSE 2 END - CASE ''database'' WHEN ''database'' THEN 0 ELSE 2 END AS [GranteeType] 
FROM 
sys.all_objects AS sp 
INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=sp.object_id AND prmssn.minor_id=0 AND prmssn.class=1 
INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id 
WHERE 
(sp.type = @_msparam_0 OR sp.type = @_msparam_1 OR [email protected]_msparam_2) 
and([email protected]_msparam_3 and SCHEMA_NAME(sp.schema_id)[email protected]_msparam_4)', 
N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)', 
@_msparam_0=N'P',@_msparam_1=N'RF',@_msparam_2=N'PC',@_msparam_3=N'~procedure name~',@_msparam_4=N'~procedure schema~' 

это, вероятно, стоит отметить, что это не относится к пользователям, которые неявно имеют права на исполнение из-за роли членства на высоком уровне (в силу являющихся членами sysadmin сервер, например).

Он также не расширяет членство в отдельных пользователях.

0

Попробуйте этот запрос. Он вернет пользователей и роли с разрешениями EXECUTE на ВСЕ хранимые процедуры и функции. Вам нужно будет настроить фильтр только для того, что вам нужно.

SELECT 
    [UserName] = CASE princ.[type] 
        WHEN 'S' THEN princ.[name] 
        WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI 
       END, 
    [UserType] = CASE princ.[type] 
        WHEN 'S' THEN 'SQL User' 
        WHEN 'U' THEN 'Windows User' 
       END, 
    [DatabaseUserName] = princ.[name],  
    [Role] = null,  
    [PermissionType] = perm.[permission_name],  
    [PermissionState] = perm.[state_desc],  
    [ObjectType] = obj.type_desc,--perm.[class_desc],  
    [ObjectName] = OBJECT_NAME(perm.major_id), 
    [ColumnName] = col.[name] 
FROM  
    --database user 
    sys.database_principals princ 
LEFT JOIN 
    --Login accounts 
    sys.login_token ulogin on princ.[sid] = ulogin.[sid] 
LEFT JOIN   
    --Permissions 
    sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id] 
LEFT JOIN 
    --Table columns 
    sys.columns col ON col.[object_id] = perm.major_id 
        AND col.[column_id] = perm.[minor_id] 
LEFT JOIN 
    sys.objects obj ON perm.[major_id] = obj.[object_id] 
WHERE 
    princ.[type] in ('S','U') AND perm.[permission_name] = 'EXECUTE' 
UNION 
--List all access provisioned to a sql user or windows user/group through a database or application role 
SELECT 
    [UserName] = CASE memberprinc.[type] 
        WHEN 'S' THEN memberprinc.[name] 
        WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI 
       END, 
    [UserType] = CASE memberprinc.[type] 
        WHEN 'S' THEN 'SQL User' 
        WHEN 'U' THEN 'Windows User' 
       END, 
    [DatabaseUserName] = memberprinc.[name], 
    [Role] = roleprinc.[name],  
    [PermissionType] = perm.[permission_name],  
    [PermissionState] = perm.[state_desc],  
    [ObjectType] = obj.type_desc,--perm.[class_desc], 
    [ObjectName] = OBJECT_NAME(perm.major_id), 
    [ColumnName] = col.[name] 
FROM  
    --Role/member associations 
    sys.database_role_members members 
JOIN 
    --Roles 
    sys.database_principals roleprinc ON roleprinc.[principal_id] = members.[role_principal_id] 
JOIN 
    --Role members (database users) 
    sys.database_principals memberprinc ON memberprinc.[principal_id] = members.[member_principal_id] 
LEFT JOIN 
    --Login accounts 
    sys.login_token ulogin on memberprinc.[sid] = ulogin.[sid] 
LEFT JOIN   
    --Permissions 
    sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id] 
LEFT JOIN 
    --Table columns 
    sys.columns col on col.[object_id] = perm.major_id 
        AND col.[column_id] = perm.[minor_id] 
LEFT JOIN 
    sys.objects obj ON perm.[major_id] = obj.[object_id] 
WHERE perm.[permission_name] = 'EXECUTE' 
UNION 
--List all access provisioned to the public role, which everyone gets by default 
SELECT 
    [UserName] = '{All Users}', 
    [UserType] = '{All Users}', 
    [DatabaseUserName] = '{All Users}',  
    [Role] = roleprinc.[name],  
    [PermissionType] = perm.[permission_name],  
    [PermissionState] = perm.[state_desc],  
    [ObjectType] = obj.type_desc,--perm.[class_desc], 
    [ObjectName] = OBJECT_NAME(perm.major_id), 
    [ColumnName] = col.[name] 
FROM  
    --Roles 
    sys.database_principals roleprinc 
LEFT JOIN   
    --Role permissions 
    sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id] 
LEFT JOIN 
    --Table columns 
    sys.columns col on col.[object_id] = perm.major_id 
        AND col.[column_id] = perm.[minor_id]     
JOIN 
    --All objects 
    sys.objects obj ON obj.[object_id] = perm.[major_id] 
WHERE 
    --Only roles 
    roleprinc.[type] = 'R' AND 
    --Only public role 
    roleprinc.[name] = 'public' AND 
    --Only objects of ours, not the MS objects 
    obj.is_ms_shipped = 0 AND 
    perm.[permission_name] = 'EXECUTE' 
ORDER BY 
    princ.[Name], 
    OBJECT_NAME(perm.major_id), 
    col.[name], 
    perm.[permission_name], 
    perm.[state_desc], 
    obj.type_desc--perm.[class_desc] 
Смежные вопросы