我正在尝试向 SQL Server 2008 R2 数据库上的用户帐户授予只读访问权限(换句话说:仅选择查询)。我必须授予用户哪些权限才能实现此目的?
我尝试了几种服务器和数据库本身的权限组合,但在所有情况下,用户仍然可以运行更新查询,或者根本无法运行任何查询(甚至无法选择)。我总是收到错误消息
服务器主体“foo”无法在当前安全上下文中访问数据库“bar”。
感谢您的帮助,
阿德里安
答案1
我通常会做以下几件事:
USE [test]
GO
CREATE USER [ReadOnlyUser] FOR LOGIN [LOCALNT\ReadOnlyNTUser]
GO
EXEC sp_addrolemember N'db_datareader', N'ReadOnlyUser'
答案2
第一步是创建一个用户仅有的db_datareader 权限。
但不要止步于此。如果这是可以运行任何 SELECT 查询的实际人员的登录名,他们仍然可能导致很多数据库的问题。这里常见的问题甚至不是恶意用户——只是某个不了解您的索引、性能调优和高效查询编写的人。通过这种方式,在 SQL 框上创建拒绝服务的情况非常容易。
我只知道如何根据每个查询执行此操作,但至少我知道几个选项:
- 限制通过以下方式返回的记录设置行数。
- 使用设置查询调控器成本限制. (请注意,调整这一点可能比较棘手)。
为了强制用户将这些内容包含在他们的查询中,过去我使用了一个存储过程,该过程首先执行适当的 SET,然后运行提供的查询(在正确的只读用户的上下文中)。