【问题标题】:How to give to a user access to a view but not to the table the view is using?如何授予用户访问视图但不授予视图正在使用的表的权限?
【发布时间】:2015-03-15 07:36:38
【问题描述】:

我在 myCustomDatabase 中定义了以下视图:

CREATE VIEW myCustomDatabase.dbo.myView AS
   SELECT job_id  FROM msdb.dbo.sysjobhistory

myCustomDatabase 的所有者是 sa

我的当前用户(称为 currentUser)在 myCustomDatabase 上只有 db_reader 角色。

guest 已在 msdb 数据库上启用。

当我执行视图时,出现以下错误:

The SELECT permission was denied on the object 'sysjobhistory', database 'msdb', schema 'dbo'.

我了解我当前的用户在系统数据库上没有定义任何角色。

我应该向当前用户授予哪个角色/授权以允许他执行视图(仅包含系统视图的一列),但不授予他对表的完全访问权限。

要恢复以下视图,当使用 currentUser 调用时应该可以工作:

CREATE VIEW myCustomDatabase.dbo.myView AS
    SELECT job_id  FROM msdb.dbo.sysjobhistory

,但不是以下查询:

SELECT *  FROM msdb.dbo.sysjobhistory

编辑:MSDB 中的可查看表


Edit2 : 我的 SQLServer 版本是 2008

【问题讨论】:

    标签: sql-server database user-management


    【解决方案1】:

    只要所有权链没有中断,您就不需要授予视图引用的表的权限。对于不同数据库中 dbo 拥有的对象,这要求:

    1. 两个数据库都开启了 DB_CHAINING 选项(默认开启 在 msdb 中)
    2. 数据库拥有相同的所有者('sa' 是 msdb 的默认所有者)
    3. 用户在另一个数据库中有一个安全上下文(来宾是 在 msdb 中默认启用)

    因此,以下脚本应该可以完成这项工作。

    ALTER DATABASE myCustomDatabase SET DB_CHAINING ON;
    ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;
    

    请注意,只有当您信任有权创建 dbo 拥有的对象的特权用户时,才应在 sa 拥有的数据库中启用 DB_CHAINING。如果只有系统管理员角色成员无论如何都可以创建对象,则无需考虑。此外,如果旧所有者不是 sysadmin 角色成员并且您需要该登录名来保留 dbo 权限,请将旧所有者添加为常规数据库用户并添加到 db_owner 角色。

    【讨论】:

    • 我的自定义数据库不属于 sa 用户,如果我按照您的建议将 sa 设置为所有者,它会破坏一些现有的访问规则吗?
    • @Fractaliste,我在帖子中添加了更多信息。这也可以通过证书来完成。如果您指定您使用的 SQL Server 版本,我将添加有关该技术的更多信息。
    • 如果两个数据库都是sa所有的,我不需要执行ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;不是吗?
    • @Fractaliste,正确的。如果用户数据库已经被 sa 拥有,则无需更改所有者。
    • 感谢您的建议,我会早点运行您的 ALTER AUTHORIZATION 脚本,问题是关于数据库所有权的界面令人困惑(有关详细信息,请参阅 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2017-05-11
    • 2011-05-07
    • 1970-01-01
    • 2016-12-14
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多