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

新手上路,请多包涵

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

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

 databasename..sp_helpprotect 'storedProcedureName', 'username'

但是,如果用户是具有执行权限的角色的成员 sp_helprotect 不会帮助我。

理想情况下,我希望能够调用类似的东西

databasename..sp_canexecute 'storedProcedureName', 'username'

这将返回一个布尔值。

原文由 Andrew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 671
2 个回答

尝试这样的事情:

 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

原文由 Dane 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进