15

我正在使用 SQL Server 2008 R2。我需要列出数据库用户(MYUSER)具有执行权限的所有存储过程。

另外,我需要列出哪些是用户没有 EXECUTE 权限的存储过程 - 但可以读取存储过程的脚本

是否有任何用于这些目的的 SQL 语句或辅助函数?

参考:

  1. 授予对某个数据库中所有存储过程的执行权限
4

5 回答 5

19

使用HAS_PERMS_BY_NAME

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
于 2012-10-31T07:54:14.010 回答
16

要检查其他用户的权限,请使用以下命令:

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。

于 2014-08-07T08:56:19.850 回答
9

由于缺少权利,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 上测试

于 2015-07-07T10:52:14.227 回答
5

HAS_PERMS_BY_NAME,如在第一个答案中提供的脚本的上下文中使用的那样,仅当您连接时才会提供所需的结果,"MYUSER"因为此功能

"评估当前用户的有效权限"

于 2012-11-01T22:44:55.590 回答
2

扩展上面接受的答案,为了检查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
于 2020-11-06T19:14:59.510 回答