SQL - выяснение, для каких хранимых процедур пользователь не имеет прав на выполнение. - PullRequest
0 голосов
/ 15 мая 2018

Добрый день,

, поэтому мне было поручено попытаться проверить пользовательские разрешения для конкретного пользователя в 413 хранимых процедурах.В основном для тех, к которым он не имеет доступа.

В настоящее время у меня есть: -

select name, 
HAS_PERMS_BY_NAME(name, 'OBJECT', 'EXECUTE') as has_execute
from sys.procedures
where HAS_PERMS_BY_NAME(name, 'OBJECT', 'EXECUTE') = 0;

, но по какой-то причине это не работает, и в таблице ничего не отображается.Тем не менее, я знаю, что у него нет прав на выполнение некоторых таблиц, я это вижу!

Итак, я всего лишь ученик с низким уровнем подготовки и не занимался SQL особенно долго, поэтому любые рекомендации будут с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 15 мая 2018

В качестве альтернативы подходу, который вы используете, приведенный ниже скрипт вернет все процедуры для данной базы данных, для которых указанный пользователь имеет разрешения на выполнение.Его можно легко настроить для других типов (например, представлений или таблиц), а также для других указанных уровней разрешений.

USE [Database]
GO

DECLARE @UserToCheck varchar(200) = 'UserToCheck'

SELECT DISTINCT  
    O.Name as ProcedureName,
    IIF(P.Name IS NULL, 0, 1) AS HasExplicitExecutePermission,
    P.Name as SysUser , 
    P.permission_name As Permission
FROM sys.objects O
LEFT JOIN (
    SELECT A.major_id, B.Name, A.permission_name
    FROM sys.database_permissions A
    JOIN sys.database_principals B ON  A.grantee_principal_id = B.principal_id
    WHERE 
        B.Name = @UserToCheck AND 
        A.permission_name = 'EXECUTE' AND
        A.state IN ('G', 'W')
) P ON P.major_id = O.object_id
WHERE 
    o.type = 'P'  --Stored Proc
Order By HasExplicitExecutePermission Asc, ProcedureName
...