【问题标题】:Grant execute permission for a user on all stored procedures in database?授予用户对数据库中所有存储过程的执行权限?
【发布时间】:2011-07-22 15:41:18
【问题描述】:

我从旧数据库生成脚本,创建一个新数据库并从旧数据库导入所有数据。然而,到目前为止还不错,没有用户拥有存储过程的执行权限。我知道我可以使用

GRANT EXECUTE ON [storedProcName] TO [userName] 

如果只是几个程序,那么我有大约 100 个程序,那么对我来说,将特定用户的执行权限授予所有程序的最简单方法是什么?

提前致谢。

【问题讨论】:

    标签: sql sql-server sql-server-2000


    【解决方案1】:

    创建一个角色将该角色添加到用户,然后您可以将所有例程一次性授予该角色执行。

    CREATE ROLE <abc>
    GRANT EXECUTE TO <abc>
    

    编辑
    这适用于 SQL Server 2005,我不确定此功能的向后兼容性,我确信 2005 年以后的任何东西都可以。

    【讨论】:

    • 我刚刚在 SQL Server 2008 Standard (amazon RDS) 上尝试过,效果非常棒。
    • 您能举个例子吗?假设我需要为用户 SPExecuter 授予所有 SP 的 EXECUTE 权限
    • 唯一需要的其他语句是将用户添加到角色的行,如下所示:ALTER ROLE [abc] ADD MEMBER [user_name]
    • 您实际上不需要创建角色,您可以将其直接应用于用户,例如授予用户名执行权限。我认为这足以解决 OP 的问题。
    • 问题是如何授予一个用户权限,而不是如何授予角色权限,我认为正确答案是 Bartosz X。 GRANT EXEC TO [User_Name];
    【解决方案2】:

    在不使问题过于复杂的情况下,在所选数据库上授予 EXECUTE 权限:

    USE [DB]
    GRANT EXEC TO [User_Name];
    

    【讨论】:

    • 为我工作,大概涵盖了所有未来的存储过程(我们会发现),而不是命名每个存储过程的脚本。
    【解决方案3】:

    这是一种解决方案,意味着当您向架构中添加新的存储过程时,用户可以执行它们而无需对新的存储过程调用 grant execute:

    IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'asp_net')
    DROP USER asp_net
    GO
    
    IF  EXISTS (SELECT * FROM sys.database_principals 
    WHERE name = N'db_execproc' AND type = 'R')
    DROP ROLE [db_execproc]
    GO
    
    --Create a database role....
    CREATE ROLE [db_execproc] AUTHORIZATION [dbo]
    GO
    
    --...with EXECUTE permission at the schema level...
    GRANT EXECUTE ON SCHEMA::dbo TO db_execproc;
    GO
    
    --http://www.patrickkeisler.com/2012/10/grant-execute-permission-on-all-stored.html
    --Any stored procedures that are created in the dbo schema can be 
    --executed by users who are members of the db_execproc database role
    
    --...add a user e.g. for the NETWORK SERVICE login that asp.net uses
    CREATE USER asp_net 
    FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] 
    WITH DEFAULT_SCHEMA=[dbo]
    GO
    
    --...and add them to the roles you need
    EXEC sp_addrolemember N'db_execproc', 'asp_net';
    EXEC sp_addrolemember N'db_datareader', 'asp_net';
    EXEC sp_addrolemember N'db_datawriter', 'asp_net';
    GO
    

    参考:Grant Execute Permission on All Stored Procedures

    【讨论】:

      【解决方案4】:

      使用下面的代码,更改正确的数据库名称和用户名,然后获取该输出并在 SSMS 中执行。用于 SQL 2005 以上

      USE <database_name> 
      select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
      from sys.objects  
      where type ='P' 
      and is_ms_shipped = 0  
      

      【讨论】:

      • 您还需要包含“PC”类型以包含 CLR 存储过程。
      【解决方案5】:
      USE [DATABASE]
      
      DECLARE @USERNAME VARCHAR(500)
      
      DECLARE @STRSQL NVARCHAR(MAX)
      
      SET @USERNAME='[USERNAME] '
      SET @STRSQL=''
      
      select @STRSQL+=CHAR(13)+'GRANT EXECUTE ON ['+ s.name+'].['+obj.name+'] TO'+@USERNAME+';'
      from
          sys.all_objects as obj
      inner join
          sys.schemas s ON obj.schema_id = s.schema_id
      where obj.type in ('P','V','FK')
      AND s.NAME NOT IN ('SYS','INFORMATION_SCHEMA')
      
      
      EXEC SP_EXECUTESQL @STRSQL
      

      【讨论】:

        猜你喜欢
        • 2011-07-03
        • 2020-03-16
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2018-04-07
        • 2021-01-01
        相关资源
        最近更新 更多