6

我的公司聘请了一名承包商为我们做一个小项目,他需要从我们主数据库中的一个视图中选择数据 ( SQL Server 2005)。

我想为他创建一个锁定SQL Server登录,仅具有“他的”视图的权限SELECT......而没有别的。

所以我在服务器上创建了一个新用户,然后我只给了他一个视图的权限:

grant select on SpecialView to SpecialUser;

基本上,这是可行的——他看不到我们的任何表和存储过程,也看不到除“他的”之外的任何视图。

但:

  • 他可以访问所有系统视图
  • 他可以访问所有系统存储过程。

显然他的权限被自动锁定(sys.objects只显示他有权限的对象,sp_who只显示他自己的进程等等)。

所以,我的问题是:

是否可以在不访问系统视图和存储过程的情况下创建用户?
(如果是,我做错了什么?)

或者是否有某些原因导致即使锁定的用户也需要访问系统视图和存储过程?

编辑:
kevchadders,用户无权访问 master、model 或 msdb - 只能访问具有他应该看到的视图的数据库。

但是,要明确一件事:用户可以看到的系统视图/过程在“他的”视图所在的数据库中......不在主数据库中。所以我不能禁用他的所有访问权限,因为他需要从同一个数据库中的一个视图中进行选择。
关键是,即使我只为他应该看到的单个视图明确设置权限,为什么他仍然可以看到系统视图/procs?

4

3 回答 3

2

使用DENY VIEW DEFINITION. 您不能取消用户查看视图和存储过程是否存在的能力,但可以取消查看其中(大部分)内容的能力。

deny view definition to smallperms_role 
go
sp_addrolemember 'smallperms_role ', 'smallperms_user'
go
sp_addrolemember 'db_datareader', 'smallperms_user'
go

例如:
EXEC sys.sp_databases不返回任何内容,但会执行。
SELECT * FROM INFORMATION_SCHEMA.TABLES什么都不返回,但不返回错误。

于 2010-07-16T18:51:05.973 回答
1

右键单击用户并选择“用户映射”页面。

从那里您是否尝试过禁用他对mastermodelmsdb数据库的所有访问权限?

我认为他将在所有 3 个中设置为公共,因此您可以尝试删除公共角色,以查看在运行这些系统视图/存储过程时它对他的登录有什么影响。

或者最好还是创建一个测试登录来试验它。

于 2010-07-16T10:05:36.403 回答
0

我认为您不能删除用户的 PUBLIC 访问权限。(来自用户属性)

您可以从数据库属性中拒绝对 PUBLIC 的权限。

  • 右键单击数据库
  • 转到属性
  • 转到权限
  • 更改 GUEST 角色的权限。

但是您不能拒绝 Master 或 Temp dbs 上的“CONTROL”权限,如果您拒绝 MASTER 上的 SELECT,您将无法登录服务器。

于 2010-07-16T12:58:32.203 回答