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

时间:2012-10-31 06:22:07

标签: sql-server stored-procedures sql-server-2008-r2

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

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

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

参考:

  1. Granting execute permission on all stored procedures in a certain database

5 个答案:

答案 0 :(得分:11)

使用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

答案 1 :(得分:7)

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

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。

答案 2 :(得分:5)

第一个答案中提供的脚本上下文中使用的

HAS_PERMS_BY_NAME仅在您以"MYUSER"身份连接后才能提供所需的结果

  

“评估当前用户的有效权限”

答案 3 :(得分:4)

由于缺少权利,knb的答案对我不起作用。 (针对与当前用户不同的用户的解决方案)

  

无法作为数据库主体执行,因为主体"我的用户"   不存在,这种类型的委托人不能被冒充,或者你   没有许可。

answer显示了如何获取特定数据库用户(我的用户')已明确授予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上测试

答案 4 :(得分:0)

在上面接受的答案之外,为了检查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