MS SQL Server: проверьте, может ли пользователь выполнить хранимую процедуру - PullRequest
8 голосов
/ 27 января 2009

Как проверить, может ли пользователь выполнить хранимую процедуру на сервере MS SQL?

Я могу видеть, имеет ли пользователь явные разрешения на выполнение, подключившись к базе данных master и выполнив:

databasename..sp_helpprotect 'storedProcedureName', 'username'

однако, если пользователь является участником роли с разрешениями на выполнение, sp_helprotect мне не поможет.

В идеале я хотел бы иметь возможность назвать что-то вроде

databasename..sp_canexecute 'storedProcedureName', 'username'

что бы вернуть bool.

Ответы [ 3 ]

12 голосов
/ 27 января 2009
4 голосов
/ 27 января 2009

Попробуйте что-то вроде этого:

CREATE PROCEDURE [dbo].[sp_canexecute]
@procedure_name varchar(255),
@username varchar(255),
@has_execute_permissions bit OUTPUT
AS

IF EXISTS (
        /* Explicit permission */
        SELECT 1
        FROM sys.database_permissions p
        INNER JOIN sys.all_objects o ON p.major_id = o.[object_id] AND o.[name] = @procedure_name
        INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND dp.[name] = @username
    )
    OR EXISTS (
        /* Role-based permission */
        SELECT 1
        FROM sys.database_permissions p
        INNER JOIN sys.all_objects o ON p.major_id = o.[object_id]
        INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND o.[name] = @procedure_name
        INNER JOIN sys.database_role_members drm ON dp.principal_id = drm.role_principal_id
        INNER JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id AND dp2.[name] = @username
    )
BEGIN
    SET @has_execute_permissions = 1
END
ELSE
BEGIN
    SET @has_execute_permissions = 0
END
GO
1 голос
/ 27 января 2009

Предполагается, что SP выполняет только оператор SELECT:

EXECUTE AS USER = [ID пользователя / логин]
EXEC sp_foobar (sna, fu)
REVERT

Важно отметить, что вам нужно будет выполнить команду REVERT после приглашения, так как SQL Server будет рассматривать вас как пользователя, которого вы выполняете, пока вы не отключите соединение или не откроете олицетворение. Тем не менее, вы должны точно знать, что получит пользователь (получить несколько строк, но не все? Это должно вам помочь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...