如何授予用户访问视图但不授予视图正在使用的 table 的权限?

How to give to a user access to a view but not to the table the view is using?

我已将以下视图定义到 myCustomDatabase:

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

myCustomDatabase 的所有者是 sa

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

guestmsdb 数据库上启用。

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

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

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

我应该给我的当前用户提供哪个 role/authorization 以允许他执行视图(其中仅包含系统一列的一列),但不给他完全访问 table.

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

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

,但不是以下查询:

SELECT *  FROM msdb.dbo.sysjobhistory

编辑:可在 MSDB 中查看 table 秒


Edit2 : 我的 SQLServer 版本是 2008

只要所有权链未中断,您就不需要授予对视图引用的表的权限。对于不同数据库中 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 角色成员可以创建对象,那么这不是一个考虑因素。此外,如果旧所有者不是 sysadmin 角色成员并且您需要该登录名来保留 dbo 权限,请将旧所有者添加为常规数据库用户并添加到 db_owner 角色。