You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取拥有所有存储过程执行权限的用户列表及权限核查

核查数据库级别EXECUTE权限及获取授权用户列表

一、核查权限是否为数据库级别授予

你执行的GRANT EXECUTE TO SQLUSERNAME属于数据库级权限授予,这类权限不会针对单个存储过程生成独立的权限记录,因此直接查询sys.objects关联的对象级权限自然看不到结果。可以通过以下SQL语句直接核查数据库级的EXECUTE权限授予记录:

SELECT 
    dp.permission_name,
    dp.state_desc AS 权限状态,
    dp.class_desc AS 权限级别,
    gr.name AS 被授权用户/角色名,
    pr.name AS 授权者名
FROM sys.database_permissions dp
JOIN sys.database_principals gr ON dp.grantee_principal_id = gr.principal_id
JOIN sys.database_principals pr ON dp.grantor_principal_id = pr.principal_id
WHERE 
    dp.permission_name = 'EXECUTE'
    AND dp.class = 0; -- class=0 代表权限作用于整个数据库

如果查询结果中出现目标用户,即可确认该权限是数据库级别的授予。

二、获取所有被授予此类权限的用户列表

需要区分直接授权和通过角色继承授权两种场景,以下SQL可以覆盖这两种情况:

-- 1. 直接被授予数据库级EXECUTE权限的用户
SELECT 
    gr.name AS 用户名,
    '直接授予' AS 权限来源
FROM sys.database_permissions dp
JOIN sys.database_principals gr ON dp.grantee_principal_id = gr.principal_id
WHERE 
    dp.permission_name = 'EXECUTE'
    AND dp.class = 0
    AND gr.type IN ('U', 'S'); -- U=数据库用户,S=SQL登录用户

UNION ALL

-- 2. 通过角色继承数据库级EXECUTE权限的用户
SELECT 
    u.name AS 用户名,
    '通过角色 ' + r.name + ' 继承' AS 权限来源
FROM sys.database_role_members drm
JOIN sys.database_principals r ON drm.role_principal_id = r.principal_id
JOIN sys.database_principals u ON drm.member_principal_id = u.principal_id
JOIN sys.database_permissions dp ON r.principal_id = dp.grantee_principal_id
WHERE 
    dp.permission_name = 'EXECUTE'
    AND dp.class = 0
    AND u.type IN ('U', 'S');

补充说明

  • 数据库级的EXECUTE权限会让用户拥有当前数据库内所有可执行对象(存储过程、标量函数、表值函数等)的执行权限,因此HAS_PERMS_BY_NAME能正确返回用户可执行的存储过程列表。
  • 单个对象的权限记录(如针对某一个存储过程的EXECUTE授权)只会出现在sys.database_permissions中class=1(对象级别)的条目里,而数据库级授权不会生成这类条目。

内容的提问来源于stack exchange,提问作者variable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:23:21