【问题标题】:The EXECUTE permission was denied on the object 'xxxxxxx', database 'zzzzzzz', schema 'dbo'对象“xxxxxxx”、数据库“zzzzzzz”、模式“dbo”的执行权限被拒绝
【发布时间】:2010-09-14 11:19:58
【问题描述】:

我在执行函数时遇到问题。

这就是我所做的:

  1. 使用 SQL Server Management Studio 创建函数。已成功创建。
  2. 然后我尝试执行新创建的函数,结果如下:

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

【问题讨论】:

  • 如果有db_owner角色,用户也可以执行(不等于授予exec...)
  • 当我的 SQL 语句出现语法错误时,我收到了这个错误。基本上我已经将GOCreate 合并到GOCreate 中。其他语法错误似乎也给出了这个错误。

标签: sql-server


【解决方案1】:

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

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

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

【讨论】:

  • 嗨,我知道这是不久前的事了,但我有一个问题。这样的操作会不会有一些安全问题?它是否打开sp供所有人使用?
  • 是的,它确实允许任何与数据库连接的人运行存储过程。我希望担心安全问题的人们能够授予对他们的数据库中的相关组的访问权限。
  • 您也可以使用GRANT EXEC TO PUBLIC 来授予对数据库中所有对象的访问权限
  • 我永远不会向公共角色授予执行权限。在我们的环境中,任何方式都要求禁用公共角色。我总是向特定用户或为此目的明确创建的角色授予执行权限。
  • 为什么每个人都赞成 cmets 建议授予 PUBLIC 权限以在数据库中执行任何操作?这是一个特殊情况,不是事实。
【解决方案2】:

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

CREATE ROLE db_executor;

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

GRANT EXECUTE TO db_executor;

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

For more detail read full article

【讨论】:

  • 如果您需要将所有 SP 的 EXECUTE 授予特定用户登录,则此答案是最好的——不使用 public 或 db_owner。似乎是这里最谨慎和有用的答案。
  • 出于某种原因,这是在 SQL Server 2012 上对我有用的唯一答案。给我的用户明确的 EXECUTE 权限是行不通的。只有通过角色继承权限才有效。
  • 然后添加到EXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'等账号中
【解决方案3】:

在 SQL Server Management Studio 中,转到security->schema->dbo

双击dbo,选择权限页面,然后点击蓝色的“查看数据库权限”链接:

选择您要更改权限的用户,并在“显式”选项卡下查找“执行”权限:

通过选中相应的框来选择相应的权限。

【讨论】:

  • 这在 Azure SQL 中不起作用:(
【解决方案4】:

你需要运行这样的东西

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

【讨论】:

  • 这是我需要的,但我必须这样做 [domain\user] 而不是 'domain\user'
【解决方案5】:

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

使用 Microsoft SQL Server Management Studio:

  1. 转到:数据库
  2. 右键单击 dbo.my_database
  3. 选择:属性
  4. 在左侧面板上,单击:权限
  5. 在名称面板中选择用户或角色
  6. 在权限中找到执行并勾选:Grant、With Grant 或 Deny

【讨论】:

  • 很遗憾,用户已经拥有执行权限!这就是为什么这如此令人困惑......
【解决方案6】:

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

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

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

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

现在用户 myusernameNoquotes 可以执行过程 storedProcedureNameNoquotes 而无需其他不必要的权限访问您的宝贵数据。

【讨论】:

    【解决方案7】:

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

    欲了解更多信息,请参阅GRANT Object Permissions (Transact-SQL)

    【讨论】:

      【解决方案8】:

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

      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
      

      【讨论】:

        【解决方案9】:

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

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

        “Public”是所有用户都属于的默认数据库角色。

        【讨论】:

          【解决方案10】:

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

          【讨论】:

          • 我不认为这是一个好的解决方案...因为我不能给我的网络应用程序这个权限..我不知道谁投票这个
          • 不推荐,因为这是非常不安全的。您应该创建适当的角色,而不是使用可以完全控制整个数据库的 db_owner
          【解决方案11】:

          如果你让这个用户对特定的数据库特别,那么你可能没有在属性的“用户映射”中将它设置为 db_owner

          【讨论】:

            【解决方案12】:

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

            直接查询:

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

            【讨论】:

              【解决方案13】:

              一般的答案是如上所述授予执行权限。但如果 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】:

                如果您只需要授予单个功能,那么(只有 db admin 可以这样做):

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

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

                【讨论】:

                  【解决方案15】:

                  您最好修改服务器角色,这是为安全权限而设计的。将 sysadmin 服务器角色添加到您的用户。为了更好的安全性,您可能拥有自定义服务器角色。但是这种方法现在可以满足您的需求。

                  1. 对象资源管理器 -> 服务器 -> 安全 -> 登录
                  2. 右键单击您想要的用户
                  3. 转到左侧的服务器角色
                  4. 确保选中系统管理员
                  5. 点击确定并重新启动您的 SQL 服务器

                  祝你好运

                  【讨论】:

                  • 系统管理员完全是矫枉过正(而且很危险)
                  猜你喜欢
                  • 1970-01-01
                  • 2011-03-27
                  • 2014-02-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多