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 对所有存储过程的主要内容,如果未能解决你的问题,请参考以下文章

EXECUTE 识别存储过程,CALL 不识别

在 TableAdapter 中使用使用“EXECUTE”命令的存储过程

如何对链接服务器执行存储过程?

如何使用 SqlCommand::Execute(或替代方法)从同一存储过程中“选择 *”和“选择计数(*)”?

在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE

在其执行存储过程中查找Execute SQL任务组件ID