代码之家  ›  专栏  ›  技术社区  ›  Christian Specht

创建一个拥有读取一个视图和其他视图的权限的SQL Server用户-但他能看到系统视图和过程吗?

  •  6
  • Christian Specht  · 技术社区  · 14 年前

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

    我想创建一个锁定的 SQL Server 为他登录,权限仅限于 SELECT 从“他”的观点来看……没有别的。

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

    grant select on SpecialView to SpecialUser;
    

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

    但是:

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

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

    所以,我的问题是:

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

    或者,为什么即使是被锁定的用户也需要访问系统视图和存储过程?

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

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

    3 回复  |  直到 12 年前
        1
  •  2
  •   Igor Borisenko    12 年前

    使用 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 不返回任何内容,但不返回错误。

        2
  •  1
  •   kevchadders    14 年前

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

    从那里你试过禁止他从 主人 , 模型 MSDB 数据库?

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

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

        3
  •  0
  •   Talasila    14 年前

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

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

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

    但不能拒绝master或temp dbs上的“control”权限,如果拒绝master上的select,则不能登录到服务器。