授权执行所有存储过程


Answers:


244

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]

28
+1加号:它甚至为将来的存储过程(例如那些不在数据库中的存储过程)授予EXECUTE权限-但稍后会创建。
marc_s 2012年

2
我认为值得注意的是,您user可能必须放在方括号内。在我的用例中,这至少部分是正确的,因为我的用户附加了域(即,域中带有\字符)。编辑:修复了不转义的斜杠字符
PrinceTyke

1
为什么不将用户分配给db_ddladmin角色?“ db_ddladmin固定数据库角色的成员可以在数据库中运行任何数据定义语言(DDL)命令。” -看到这里
Michael Tobisch

1
@MichaelTobisch在这里只需要执行存储过程。在创建,更改,删除等场景中必须使用DDL角色。这些链接必须是有用的:docs.microsoft.com/en-us/sql/relational-databases/security/…geeksforgeeks.org/sql-ddl-dml-dcl-tcl-commands
QMaster

2
下一步将用户添加到角色中以防他人节省研究工作。ALTER ROLE db_executor添加成员YourUserNameHere
Piwaf

72

如上所述,SQL Server 2005引入了向数据库原则授予数据库执行权限的功能

GRANT EXECUTE TO [MyDomain\MyUser]

这将在数​​据库范围内授予权限,该权限将隐式包括所有架构中的所有存储过程。这意味着您不必显式地为每个存储过程授予权限。

如果您想更精细,也可以通过授予架构执行权限来进行限制:

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

5
很高兴能够对特定的架构执行此操作,因此避免了对sys的权限
RemarkLima 2014年

17

除了上述答案,我还要添加:


您可能想要将此权限授予角色,然后将角色分配给用户。假设你已经创建了一个角色myAppRights通过

CREATE ROLE [myAppRights] 

那么您可以通过以下方式授予执行权限

GRANT EXECUTE TO [myAppRights] 

扮演那个角色。


或者,如果要在架构级别执行此操作:

GRANT EXECUTE ON SCHEMA ::dbo TO [myAppRights]

也可以使用(在此示例中,该角色之后myAppRights将对架构的所有元素具有执行权限dbo)。

这样,您只需要做一次,就可以在以后需要更改权限的情况下轻松地向用户分配权限/从用户撤消所有相关的应用程序权限-如果要创建更复杂的访问配置文件,则尤其有用。

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


-5

授予执行权[角色]

这个肯定有帮助


您不想将执行授予公共角色,这会带来安全问题。只需将其授予用户或角色即可。将执行授予特定的proc是最好的方法,因此您可以控制谁在做什么。
ammills01 '18 -10-3

这里的嘲讽不适用于问答场所,尤其是当它可能产生危险的结果时。
克里斯托弗·布朗

“每个登录名都属于公共固定服务器角色,每个数据库用户都属于公共数据库角色。当未授予或拒绝安全对象的特定权限时,该登录名或用户将继承授予公共权限的权限。这样安全”,因此授予PUBLIC任何权限都意味着将这些权限授予所有用户。这是一个很大的漏洞。请阅读此链接以获取更多信息:docs.microsoft.com/zh-cn/sql/relational-databases/security/…–
QMaster

有了这样的答案,难怪那里有这么多安全性差的网站和数据库。真是的
戴夫·卢克雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.