MS SQL Server: Check to see if a user can execute a stored procedure

前端 未结 3 1791
北荒
北荒 2020-12-16 23:17

How can you check to see if a user can execute a stored procedure in MS SQL server?

I can see if the user has explicit execute permissions by connecting to the maste

相关标签:
3条回答
  • 2020-12-17 00:05

    Assuming the SP only runs a SELECT statement:

    EXECUTE AS USER = [User's ID/Login]
    EXEC sp_foobar( sna, fu)
    REVERT

    It's important to note that you will need to run the REVERT command after the prompt as SQL Server will regard you as the user you are EXECUTING AS until you either shut down the connection or REVERT the impersonation. That said, you should see exactly what a user would get (getting some rows but not all? This should help you out).

    0 讨论(0)
  • 2020-12-17 00:07

    fn_my_permissions and HAS_PERMS_BY_NAME

    0 讨论(0)
  • 2020-12-17 00:10

    Try something like this:

    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
    
    0 讨论(0)
提交回复
热议问题