我正在使用 SQL Server 2008 R2。我需要列出数据库用户(MYUSER)具有执行权限的所有存储过程。
另外,我需要列出哪些是用户没有 EXECUTE 权限的存储过程 - 但可以读取存储过程的脚本
是否有任何用于这些目的的 SQL 语句或辅助函数?
参考:
我正在使用 SQL Server 2008 R2。我需要列出数据库用户(MYUSER)具有执行权限的所有存储过程。
另外,我需要列出哪些是用户没有 EXECUTE 权限的存储过程 - 但可以读取存储过程的脚本
是否有任何用于这些目的的 SQL 语句或辅助函数?
参考:
select name,
has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute,
has_perms_by_name(name, 'OBJECT', 'VIEW DEFINITION') as has_view_definition
from sys.procedures
要检查其他用户的权限,请使用以下命令:
use my_db;
EXECUTE AS user = 'my_user'
SELECT SUSER_NAME(), USER_NAME();
select name,
has_perms_by_name(name, 'OBJECT', 'EXECUTE') as has_execute
from sys.procedures
where name = 'myprocname';
revert;
适用于我的 SQL Server 2012。
由于缺少权利,knb 的答案对我不起作用。(针对与当前用户不同的用户的解决方案)
无法作为数据库主体执行,因为主体“我的用户”不存在,无法模拟此类主体,或者您没有权限。
此答案显示了如何获取特定数据库用户(“我的用户”)明确授予 EXECUTE 权限的存储过程列表:
SELECT [name]
FROM sys.objects obj
INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id
WHERE obj.[type] = 'P' -- stored procedure
AND dp.permission_name = 'EXECUTE'
AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT
AND dp.grantee_principal_id =
(SELECT principal_id
FROM sys.database_principals
WHERE [name] = 'my user')
我对其进行了如下修改以获得我需要的列表:
SELECT [name]
FROM sys.procedures
WHERE [name] NOT IN
(SELECT [name]
FROM sys.objects obj
INNER JOIN sys.database_permissions dp ON dp.major_id = obj.object_id
WHERE obj.[type] = 'P' -- stored procedure
AND dp.permission_name = 'EXECUTE'
AND dp.state IN ('G', 'W') -- GRANT or GRANT WITH GRANT
AND dp.grantee_principal_id =
(SELECT principal_id
FROM sys.database_principals
WHERE [name] = 'my user'))
在 Microsoft SQL Server 2008 R2 上测试
HAS_PERMS_BY_NAME
,如在第一个答案中提供的脚本的上下文中使用的那样,仅当您连接时才会提供所需的结果,"MYUSER"
因为此功能
"评估当前用户的有效权限"
扩展上面接受的答案,为了检查dbo
模式之外的对象,请使用以下语句。
SELECT
name,
HAS_PERMS_BY_NAME(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name), 'OBJECT', 'EXECUTE') AS has_execute,
HAS_PERMS_BY_NAME(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name), 'OBJECT', 'VIEW DEFINITION') AS has_view_definition
FROM sys.procedures