【问题标题】:GRANT EXECUTE to all stored proceduresGRANT EXECUTE 对所有存储过程
【发布时间】:2012-03-08 10:40:11
【问题描述】:

以下命令是否有效地授予用户“MyUser”执行数据库中所有存储过程的权限?

GRANT EXECUTE TO [MyDomain\MyUser]

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 permissions


    【解决方案1】:

    SQL Server 2008 及更高版本:

    /* CREATE A NEW ROLE */
    CREATE ROLE db_executor
    
    /* GRANT EXECUTE TO THE ROLE */
    GRANT EXECUTE TO db_executor
    

    仅适用于用户(而非角色):

    USE [DBName]
    GO
    GRANT EXECUTE TO [user]
    

    【讨论】:

    • +1 加:它甚至授予未来存储过程的 EXECUTE 权限,例如那些还没有在你的数据库中 - 但稍后会创建。
    • 我认为值得注意的是,您的user 可能必须在方括号内。这在我的用例中是正确的,至少部分是因为我的用户附加了一个域(即它有一个 \ 字符)。编辑:固定未转义的斜杠字符
    • 为什么不将用户分配给 db_ddladmin 角色? “db_ddladmin 固定数据库角色的成员可以在数据库中运行任何数据定义语言 (DDL) 命令。” - 见here
    • 以及将用户添加到角色的下一个级别,以防它为某人节省了另一个研究步骤。 ALTER ROLE db_executor 添加成员 YourUserNameHere
    • @MichaelTobisch db_ddladmin 不授予执行存储过程的权限;它允许访问创建/更改/删除存储过程。
    【解决方案2】:

    SQL Server 2005 将grant database execute permissions 的功能引入了数据库原则,正如您所描述的:

    GRANT EXECUTE TO [MyDomain\MyUser]
    

    这将授予数据库范围的权限,其中隐式包括所有模式中的所有存储过程。这意味着您不必为每个存储过程显式授予权限。

    如果您想更细化,也可以通过granting schema execute permissions 进行限制:

    GRANT EXECUTE ON SCHEMA ::dbo TO [MyDomain\MyUser]
    

    【讨论】:

    • 很高兴能够对特定架构执行此操作,因此避免了对 sys 的权限
    【解决方案3】:

    除了上面的答案,我想补充一下:


    您可能希望将此授予角色,然后将该角色分配给用户。 假设您通过

    创建了一个角色myAppRights
    CREATE ROLE [myAppRights] 
    

    然后您可以通过

    授予执行权限
    GRANT EXECUTE TO [myAppRights] 
    

    到那个角色。


    或者,如果您想在架构级别进行:

    GRANT EXECUTE ON SCHEMA ::dbo TO [myAppRights]
    

    也可以(在本例中,角色myAppRights 之后将对架构dbo 的所有元素拥有执行权限)。

    这样,您只需执行一次,并且可以轻松地向用户分配/撤销所有相关的应用程序权限,如果您以后需要更改它 - 如果您想创建更复杂的访问配置文件,这尤其有用。

    注意:如果您将角色授予架构,这也会影响您稍后将创建的元素 - 这可能有益或无益,具体取决于您想要的设计,因此请记住这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多