查找具有执行权限的存储过程

LCJ*_*LCJ 8 sql-server stored-procedures sql-server-2008-r2

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

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

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

参考:

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

Rem*_*anu 13

用途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
Run Code Online (Sandbox Code Playgroud)

  • 我可以使用“Script Stored Procedure As”-->“Create To”查看存储过程的脚本;但是 has_view_definition 是“0”。我们怎样才能纠正它? (2认同)
  • 你能运行 [`SELECT * FROM sys.fn_my_permissions('<procedure>', 'OBJECT')`](http://msdn.microsoft.com/en-us/library/ms176097.aspx) 并在此处发布结果? (2认同)
  • 顺便说一句,我的查询不处理其他架构中的过程,而不是 dbo。你可以很容易地自己解决这个问题。 (2认同)

knb*_*knb 8

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

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;
Run Code Online (Sandbox Code Playgroud)

适用于我的SQL Server 2012.


oft*_*lit 8

由于缺少权利,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')
Run Code Online (Sandbox Code Playgroud)

我修改如下以获得我需要的列表:

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'))
Run Code Online (Sandbox Code Playgroud)

在 Microsoft SQL Server 2008 R2 上测试


小智 5

HAS_PERMS_BY_NAME,如在第一个答案中提供的脚本的上下文中所使用的,仅当您"MYUSER"从此函数连接后才会提供所需的结果

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