对象'xxxxxxx',数据库'zzzzzzz',架构'dbo'上的EXECUTE权限被拒绝

时间:2010-09-14 11:19:59

标签: sql-server

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

这就是我的所作所为:

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

    EXECUTE权限被拒绝   对象'xxxxxxx',数据库   'zzzzzzz',架构'dbo'。

15 个答案:

答案 0 :(得分:148)

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

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

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

答案 1 :(得分:89)

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

CREATE ROLE db_executor;

然后授予该角色exec权限。

GRANT EXECUTE TO db_executor;

现在,当您转到用户的属性并转到用户映射并选择已添加新角色的数据库时,现在新角色将显示在数据库角色成员资格中:section

For more detail read full article

答案 2 :(得分:58)

在Sql Server Management Studio中:

转到security->schema->dbo

双击dbo,然后点击permission tab->(blue font)view database permission,随意滚动查看"execute".等必填字段,让自己选择使用grantdeny控件。希望这会有所帮助:)

答案 3 :(得分:49)

你需要运行这样的东西

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

答案 4 :(得分:33)

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

使用Microsoft SQL Server Management Studio:

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

答案 5 :(得分:14)

提供此类权限可能会很危险,尤其是当您的Web应用程序使用相同的用户名时。

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

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

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

现在,用户myusernameNoquotes可以执行procedureProcedureNameNoquotes过程,而无需对贵重数据进行其他不必要的权限。

答案 6 :(得分:8)

虽然您有足够的权限来创建它,但您无权执行它。

有关详细信息,请参阅GRANT Object Permissions (Transact-SQL)

答案 7 :(得分: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

答案 8 :(得分:2)

你可以给每个人执行权限:

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

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

如果您使此用户特别针对特定数据库,那么您可能不会在"用户映射"中将其设置为db_owner。属性

答案 11 :(得分:1)

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

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

祝你好运

enter image description here

答案 12 :(得分:0)

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

直接查询:

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

答案 13 :(得分:0)

一般的答案是如上所述授予执行权限。但是,如果SP的架构所有者与基础对象不同,那是行不通的。

通过以下方式检查架构所有者:

select name, USER_NAME(s.principal_id) AS Schema_Owner from sys.schemas s

要更改架构的所有者,您可以:

ALTER AUTHORIZATION ON SCHEMA::YOUR_SCHEMA TO YOUR_USER;

示例:

ALTER AUTHORIZATION ON SCHEMA::Claim TO dbo
ALTER AUTHORIZATION ON SCHEMA::datix TO user1;

最后,如果在SP中要截断表或更改结构,则可能要在SP中添加WITH EXECUTE AS OWNER:

ALTER procedure [myProcedure] 
WITH EXECUTE AS OWNER

as

truncate table etl.temp

答案 14 :(得分:0)

如果你只需要授予一个功能那么(只有数据库管理员可以做到):

  1. 开放管理工作室
  2. 在 Object Eplorer 中查找您要授予的函数/过程(dbname-Programmability-[Functions/Stored Procedures]-...)
  3. 右键单击函数或过程名称并打开属性
  4. 在属性中选择权限,添加您想要的用户(或架构)并授予他执行权限。

我相信这是最安全的方法,因为您只授予用户执行此功能的权限。没有别的!