Sql server 对对象';的执行权限被拒绝;xxxxxxx';,数据库';zzzzzz';,模式';dbo';

Sql server 对对象';的执行权限被拒绝;xxxxxxx';,数据库';zzzzzz';,模式';dbo';,sql-server,Sql Server,我在执行函数时遇到问题 以下是我所做的: 使用SQL Server Management Studio创建函数。它已成功创建 然后我尝试执行新创建的函数,结果如下: 上的执行权限被拒绝 数据库中的对象“xxxxxxx” 'zzzzz',架构'dbo' 听起来您需要为所讨论的存储过程向用户(或他们所属的组)授予执行权限 例如,您可以这样授予访问权限: USE zzzzzzz; GRANT EXEC ON dbo.xxxxxxx TO PUBLIC 您没有执行它的权限,尽管您有足够的权限创建它 有

我在执行函数时遇到问题

以下是我所做的:

  • 使用SQL Server Management Studio创建函数。它已成功创建
  • 然后我尝试执行新创建的函数,结果如下:
  • 上的执行权限被拒绝 数据库中的对象“xxxxxxx” 'zzzzz',架构'dbo'


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

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

    USE zzzzzzz;
    GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
    

    您没有执行它的权限,尽管您有足够的权限创建它


    有关更多信息,请参见您需要运行类似的程序

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

    我也遇到了同样的问题,我解决了给数据库用户授予db_所有者权限的问题

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

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

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

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

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

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

    grant execute on storedProcedureNameNoquotes to myusernameNoquotes
    

    现在,用户myusernameNoquotes可以执行过程storedProcedureNameNoquotes,而无需对您的有价值的数据拥有其他不必要的权限

    如果您将此用户设置为特定数据库的专用用户,那么您可能不会在属性的“用户映射”中将其设置为db_所有者

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

    CREATE ROLE db_executor;
    
    然后授予该角色exec权限

    GRANT EXECUTE TO db_executor;
    
    现在,当您转到用户的属性并转到用户映射并选择添加了新角色的数据库时,新角色将显示在:的数据库角色成员资格部分中


    在SQL Server Management Studio中,转到
    安全性->架构->dbo

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

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


    通过选中适当的框来选择适当的权限。

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

    USE [StableEmployee]
    GO
    GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC
    
    /******对象:StoredProcess[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
    

    如果您试图向用户或角色授予权限,则此操作将起作用

    使用Microsoft SQL Server Management Studio:

  • 转到:数据库
  • 右键单击dbo.my_数据库
  • 选择:属性
  • 在左侧面板上,单击:权限
  • 在“名称”面板中选择用户或角色和
  • 在权限中查找执行,并选中:授予、授予或拒绝

  • 您最好修改服务器角色,这是为安全特权而设计的。向用户添加系统管理员服务器角色。为了提高安全性,您可以使用自定义服务器角色。但是这种方法会给你现在想要的

  • 对象资源管理器->服务器->安全->登录
  • 右键单击所需的用户
  • 转到左侧的服务器角色
  • 确保选中了sysadmin
  • 点击OK并重新启动SQL server
  • 祝你好运


    以下是如何为一个非公共用户授予权限

    直接查询:

    使用MyDatabase
    将[dbo].[My procedures name]上的执行授予[IIS APPPOOL\My IIS pool]
    
    Go

    一般的答案是授予执行权限,如上所述。但是,如果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中添加“执行为所有者”:

    ALTER procedure [myProcedure] 
    WITH EXECUTE AS OWNER
    
    as
    
    truncate table etl.temp
    

    如果您只需要授予一个函数,则(只有db admin可以这样做):

  • 开放式管理工作室
  • 在Object Eplorer中查找要授予的函数/过程(dbname可编程性-[Functions/Storage Procedures]-…)
  • 右键单击函数或过程名称并打开属性
  • 在Properties select Permissions中,添加所需的用户(或架构),并授予他执行权限

  • 我相信这是最安全的方法,因为您只允许用户执行此函数。没有别的了

    我认为这不是一个好的解决方案。。。因为我无法授予我的web应用程序此权限。。我不知道是谁投的票不推荐,因为这很不安全。您应该创建适当的角色,而不是使用db_owner,它可以完全控制整个数据库。嗨,我知道这是很久以前的事了,但我有一个问题。这样的行动可能会有一些安全问题吗?它是否打开sp供所有人使用?是的,它允许任何连接到DB的人运行存储过程。我希望担心安全性的人授予对其数据库中相关组的访问权限。您也可以使用
    grant EXEC to PUBLIC
    授予对数据库中所有对象的访问权限。我永远不会授予PUBLIC角色执行权限。在我们的环境中,任何方式都要求禁用公共角色。我总是向特定用户授予执行权限