对对象“用户”,数据库“ XXX”,模式“ dbo”的SELECT权限被拒绝


81

我将数据库从SQL Server 2012移到了Azure。我不想使用用户master,所以我创建了一个用户test。这是我在Azure上对数据库XXX所做的操作:

create user test from login test with default_schema=[dbo]
exec sp_addrolemember 'db_owner','test'

我检查了一下,对我感兴趣的数据库对象都在架构中dbo。该表Users位于架构中dbo

我的Web项目中的连接字符串已test作为登录名。它产生错误信息:

The SELECT permission was denied on the object 'Users', database 'XXX', schema 'dbo'

错误消息是什么意思,如何使用户test访问数据库XXX?


感谢您提出这个问题:)
Kamlesh

Answers:


75

我认为问题在于用户具有拒绝特权。当您创建的用户没有足够的权限访问数据库中的表时,将发生此错误。请勿将特权授予用户以获取所需内容。

GRANT用户特定权限如SELECT,INSERT,更新和删除在该数据库中的表。


3
有时您会缺少db数据读取器/ db所有者选项?windowstechinfo.com/2014/09/...
Aravinda

5
我不得不取消选中“ db_denydatareader”和“ db_denydatawriter”,我想这就是SaeX所谓的“撤销”的意思。谢谢SaeX。
啊。

@啊。我和你有同样的问题,所以我写了一个答案。看看是否有机会
Kolob Canyon

您是救生员,非常感谢:)
Kamlesh

55
  1. 打开SQL Management Studio
  2. 扩展数据库
  3. 展开“安全性”文件夹
  4. 展开“用户”
  5. 右键单击用户(尝试执行查询的用户),然后选择Properties
  6. 选择页面Membership
  7. 确保取消选中

    db_denydatareader

    db_denydatawriter

在此处输入图片说明

这应该不用说,而只是授予用户所需的权限。一个简单的懒惰修复方法是db_owner像我一样进行检查,但这不是最佳的安全实践。


4
您是救生员,非常感谢:)
Kamlesh

1
您为我节省了数小时浪费时间的谷歌搜索和沮丧!
Scott Fleming

1
我们中的许多人只是假设我们将获得所有权限,从而选择了所有这些人。但是,有一个deny
穆拉利MURUGESAN

30

授予对特定表的选择权限的语法:

USE YourDB;

GRANT SELECT ON dbo.functionName TO UserName;

授予对数据库中所有表的选择权限:

USE YourDB;

GRANT SELECT TO UserName;

2
第一次完成此操作后,我不确定是否正确,但是我想授予整个数据库的选择权限,因此我进行了GRANT SELECT TO UserName并取消了ON子句。有效。
丰富

18

这就是我面对问题时能够解决的方式

  1. 启动SQL Management Studio。
  2. 展开服务器节点(在“对象资源管理器”中)。
  3. 展开数据库节点,然后展开您要使用特定用户尝试访问的特定数据库。
  4. 展开数据库的“安全性”节点下的“用户”节点。
  5. 右键单击特定用户,然后单击“属性”。您将看到一个对话框。
  6. 确保用户是db_owner组的成员(使用此路径之前,请先阅读以下注释),并使用该视图进行其他必需的更改。(我将其用于2016年。不确定特定对话框在其他版本中的外观,因此并不具体)

6
请注意谁是db_owner数据库角色。并非所有用户都应添加到该角色。
罗德

1
@Rod如果不建议授予db_owner,那么为应用程序与数据库交互建议使用哪种访问类型?
雅各布

1
公众足够吗?
Rod

2
@Jacob要在任何表中写入和读取数据,请使用db_datareader和db_datawriter。db_owner还授予修改表定义的权限。
Oskar Berggren

3
如果用户已检查db_denydatareadedb_denydatawriter
Kolob Canyon


0

检查数据库空间。与分配给数据库的空间相比,空间增加时会出现此错误。


还要更改数据库用户名和密码
Nilesh

0

使用SSMS,我可以确保用户在数据库和ReportServer上都具有连接权限。

在要查询的特定数据库的属性下,我映射了它们的凭据并启用了datareader和公共权限。另外,正如其他人所说的-我确保没有选择denyread / denywrite框。

我不想为他们的报告启用数据库所有权,因为他们只需要具有选择权限。


-1

我这样做可以解决我的问题。[重要说明:它允许对特定帐户进行升级(扩展)特权,可能超出个别情况所需的特权]。

  1. 转到SQL Management Studio的“对象资源管理器”。
  2. 展开安全性,然后登录
  3. 选择您正在使用的用户,然后右键单击并选择Properties Windows
  4. 在“选择页面”中,转到“服务器角色”
  5. 单击sysadmin并保存。

2
不知道为什么这个答案被否决了。这个答案解决了我的问题。所以,我投票了。
Emran Hussain

9
这个答案应该被否决,因为它公然地告诉读者给用户对象对整个服务器的完全,完整和完全的控制,而没有解释或警告它是这样做的。基于问题和答复的措辞,我认为新手用户可能会在未完全理解的情况下应用此“修复”程序。
Oskar Berggren

3
这是一个蛮力选项,不应应用。如果您不了解这是做什么的,那么您不应该这样做。
n8。

大家-不要在生产环境中这样做。
gotqn19年

当然,我不会在产品中这样做,但是它解决了我的问题(在开发环境中)。因此,这值得我赞扬。谢谢ccassob。
Fl4v

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.