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

Sql server 查找具有执行权限的存储过程,sql-server,stored-procedures,sql-server-2008-r2,Sql Server,Stored Procedures,Sql Server 2008 R2,我正在使用SQLServer2008R2。我需要列出数据库用户(MYUSER)具有执行权限的所有存储过程 此外,我需要列出哪些是用户没有执行权限但可以读取存储过程脚本的存储过程 是否有用于这些目的的SQL语句或帮助函数 参考: 使用: 第一个答案中提供的脚本上下文中使用的HAS_PERMS_BY_NAME,仅当您作为“MYUSER”连接后,才会提供所需的结果 “评估当前用户的有效权限” 要检查其他用户的权限,请使用以下命令: use my_db; EXECUTE AS user = 'my_u

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

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

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

参考:

  • 使用:


    第一个答案中提供的脚本上下文中使用的HAS_PERMS_BY_NAME,仅当您作为
    “MYUSER”
    连接后,才会提供所需的结果

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


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

    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的答案不适用于我,因为缺少权限。(针对与当前用户不同的用户的解决方案)

    无法作为数据库主体执行,因为主体为“我的用户” 不存在,无法模拟此类型的主体,或者您 没有权限

    这显示了如何获取特定数据库用户(“我的用户”)已显式授予其执行权限的存储过程列表:

    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上进行了测试,扩展了上述已接受的答案,要检查
    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
    

    我可以使用“脚本存储过程为”-->“创建到”查看存储过程的脚本;但是has_view_的定义是“0”。我们如何更正它?您能运行并在这里发布结果吗?顺便说一句,我的查询不处理其他模式中的过程,而不是dbo。你可以自己很容易地解决这个问题。在2008 R2中工作
      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