对对象'xxxxxxx',数据库'zzzzzzz',模式'dbo'的EXECUTE权限被拒绝


187

我在执行功能时遇到问题。

这是我所做的:

  1. 使用SQL Server Management Studio创建一个函数。已成功创建。
  2. 然后,我尝试执行新创建的函数,这是我得到的:

对对象“ xxxxxxx”,数据库“ zzzzzzz”,模式“ dbo”的EXECUTE权限被拒绝。


如果具有db_owner角色,则用户还可以执行(不等于授予exec ...)
hazjack

当我的SQL语句中出现语法错误时,出现此错误。基本上我已经合并GOCreateGOCreate。其他语法错误也似乎导致了此错误。
Ganesh Kamath

Answers:


162

听起来您需要将相关存储过程的执行权限授予用户(或他们所属的组)。

例如,您可以这样授予访问权限:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
嗨,我知道是前一段时间,但是我有一个问题。这样的动作可能会带来一些安全问题吗?它会打开sp以供所有人使用吗?
Valentyn Vynogradskiy 2014年

9
是的,它确实允许与数据库连接的任何人运行存储过程。我希望担心安全性的人们将访问权限授予他们数据库中相关组
罗兰·肖

7
您还可以使用GRANT EXEC TO PUBLIC授予对数据库中所有对象的访问权限
sohaiby

2
我永远不会向公共角色授予执行权限。在我们的环境中,无论如何都必须禁用公共角色。我总是将执行权限授予特定用户或为此目的明确创建的角色。
user1161391

4
为什么每个人都反对建议给予公众在数据库中执行任何内容的权利的评论?那是一个特殊的情况,而不是事实。
星期六星期六

111

我发现的最佳解决方案是创建一个新的数据库角色,即

CREATE ROLE db_executor;

然后授予该角色执行权限。

GRANT EXECUTE TO db_executor;

现在,当您转到用户的属性并转到“用户映射”并选择已添加新角色的数据库时,新角色将在“数据库角色成员身份”部分中可见:

有关更多详细信息,请阅读全文


8
如果您需要将所有SP的EXECUTE授予特定用户登录名,而无需使用public或db_owner,则此答案是最佳的。似乎是这里最谨慎,最有用的答案。
jcollum

1
由于某些原因,这是在SQL Server 2012上对我唯一有效的答案。给用户明确的EXECUTE权限不起作用。仅当它通过角色继承权限时,它才有效。
基思

1
这应该是答案。对我来说,它就像是一种魅力。非常感谢!
Shahbaaz

然后将其添加到帐户,例如EXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

在Sql Server Management Studio中:

只是去security->schema->dbo

双击dbo,然后单击permission tab->(blue font)view database permission并随意滚动查找必填字段,例如“ "execute".帮助自己选择使用” grant或“ deny控件”。希望这会有所帮助:)


52

你需要运行这样的东西

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

4
这是我所需要的,但我必须做的[domain\user]不是'domain\user'
Paul Stephenson

45

如果您尝试向用户或角色授予权限,则此方法将起作用。

使用Microsoft SQL Server Management Studio:

  1. 转到:数据库
  2. 右键单击dbo.my_database
  3. 选择:属性
  4. 在左侧面板上,单击:权限
  5. 选择用户或角色,然后在名称面板中
  6. 在权限中查找执行并选中:授予,具有授予或拒绝

不幸的是,该用户已经具有执行权限!这就是为什么会是这样混乱....
道格拉斯·加斯克尔

谢谢Keim,当我勾选Grant
Rosh

16

授予此类权限可能很危险,特别是如果您的Web应用程序使用相同的用户名。

现在,Web用户(以及整个万维网)还具有在数据库中创建和删除对象的权限。想想SQL注入!

我建议仅向给定对象上的特定用户授予执行特权,如下所示:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

现在,用户myusernameNoquotes可以执行过程storedProcedureNameNoquotes,而无需对您的重要数据进行其他不必要的许可。



3

如果您遇到上述问题,例如关于执行解决方案时引发的异常的问题,则问题是权限,未正确授予该组的用户访问数据库/存储过程的权限。您需要做的就是做类似下面的事情,用您的数据库名称,存储过程(函数)以及权限或角色的类型或授予访问权限的人替换我的数据库。

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ******对象:StoredProcedure [dbo]。[GetAllEmployees]脚本日期:01/27/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

您可以授予所有人执行权限:

GRANT Execute on [dbo].your_object to [public]

“公共”是所有用户都是其成员的默认数据库角色。


1

我也遇到了同样的问题,我也解决了向数据库用户授予db_owner权限的问题。


11
我认为这不是一个很好的解决方案...因为我无法授予我的Web应用程序此权限..我不知道是谁投票赞成
Mina Gabriel

7
不推荐,因为这是非常不安全的。您应该创建适当的角色,而不要使用对整个数据库具有完全控制权的db_owner
Yetiish 2015年


1

您最好修改为安全性特权而设计的服务器角色。将sysadmin服务器角色添加到您的用户。为了提高安全性,您可以具有自定义服务器角色。但是这种方法将为您提供您现在想要的东西。

  1. 对象资源管理器->服务器->安全->登录
  2. 右键单击所需的用户
  3. 转到左侧的服务器角色
  4. 确保已检查sysadmin
  5. 单击确定,然后重新启动SQL Server

祝好运

在此处输入图片说明


1
sysadmin完全过大(并且很危险)
Trubs

0

这是如何授予一个不公开用户的权限,

直接查询:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

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.