GRANT EXECUTE 对所有存储过程
Posted
技术标签:
【中文标题】GRANT EXECUTE 对所有存储过程【英文标题】:GRANT EXECUTE to all stored procedures 【发布时间】:2012-03-08 10:40:11 【问题描述】:以下命令是否有效地授予用户“MyUser”执行数据库中所有存储过程的权限?
GRANT EXECUTE TO [MyDomain\MyUser]
【问题讨论】:
【参考方案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
的所有元素拥有执行权限)。
这样,您只需执行一次,并且可以轻松地向用户分配/撤销所有相关的应用程序权限,如果您以后需要更改它 - 如果您想创建更复杂的访问配置文件,这尤其有用。
注意:如果您将角色授予架构,这也会影响您稍后将创建的元素 - 这可能有益或无益,具体取决于您想要的设计,因此请记住这一点。
【讨论】:
以上是关于GRANT EXECUTE 对所有存储过程的主要内容,如果未能解决你的问题,请参考以下文章
在 TableAdapter 中使用使用“EXECUTE”命令的存储过程
如何使用 SqlCommand::Execute(或替代方法)从同一存储过程中“选择 *”和“选择计数(*)”?