MS SQL Server:检查用户是否可以执行存储过程

MS SQL Server:检查用户是否可以执行存储过程,sql,sql-server,sql-server-2005,tsql,stored-procedures,Sql,Sql Server,Sql Server 2005,Tsql,Stored Procedures,如何检查用户是否可以在MS SQL server中执行存储过程 通过连接到主数据库并执行以下操作,我可以查看用户是否具有显式执行权限: databasename..sp_helpprotect 'storedProcedureName', 'username' 但是,如果用户是具有执行权限的角色的成员,sp_HelpProtect将不会帮助我 理想情况下,我希望能打电话给 databasename..sp_canexecute 'storedProcedureName', 'username'

如何检查用户是否可以在MS SQL server中执行存储过程

通过连接到主数据库并执行以下操作,我可以查看用户是否具有显式执行权限:

databasename..sp_helpprotect 'storedProcedureName', 'username'
但是,如果用户是具有执行权限的角色的成员,sp_HelpProtect将不会帮助我

理想情况下,我希望能打电话给

databasename..sp_canexecute 'storedProcedureName', 'username'

它将返回布尔值。

假设SP仅运行SELECT语句:

以用户身份执行=[用户ID/登录]
执行秘书(国民账户体系,fu)
恢复


请务必注意,您需要在提示符后运行REVERT命令,因为在您关闭连接或还原模拟之前,SQL Server会将您视为正在执行的用户。这就是说,您应该确切地看到用户将得到什么(得到一些行,但不是全部?这将帮助您解决问题)。

尝试以下方法:

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

此外,如果您使用的是SQL Server 2005或更高版本,并且已将权限分配给架构或数据库(现在可以执行),则sp_HelpProtect不会报告该权限。包含该存储过程仅用于向后兼容,并基于SQL Server 2000中的内容报告权限。如果用户是具有权限的角色的成员,并且未被明确允许执行该存储过程,则该操作是否有效?否,但是您可以将角色名称放入@username参数中,这样仍然会返回正确的/预期的布尔结果。好的,我已经更新了上面的程序代码,以通过角色和显式授予的方式授予权限。我认为这并没有考虑通过父权限授予的权限,例如,如果用户对整个模式具有执行权限,但不直接对该项具有执行权限。这是准确的吗?我不认为这些函数回答了最初的问题,即检查任何给定的用户是否对给定的存储过程具有执行权限。这两个函数的MSDN文章都说它们只返回调用主体的权限,而不是任何主体的权限。