如何为用户提供对视图的访问权限,而不是视图正在使用的表?

时间:2015-01-16 16:25:39

标签: sql-server database user-management

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

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

myCustomDatabase 的所有者是 sa

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

msdb 数据库上启用

guest

当我执行视图时,我收到以下错误:

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中的可查看表

enter image description here


Edit2:我的SQLServer版本是2008

1 个答案:

答案 0 :(得分:2)

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

  1. 两个数据库都打开了DB_CHAINING选项(默认情况下为on) 在msdb)
  2. 数据库拥有相同的所有者(' sa'是msdb的默认所有者)
  3. 用户在其他数据库中有一个安全上下文(来宾是     默认情况下在msdb中启用)
  4. 因此,以下脚本应该完成这项工作。

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

    请注意,仅当您信任具有创建dbo拥有对象权限的特权用户时,才应在sa拥有的数据库中启用DB_CHAINING。如果只有sysadmin角色成员可以创建对象,那么这不是一个考虑因素。此外,如果旧所有者不是sysadmin角色成员,并且您需要该登录以保留dbo权限,请将旧所有者添加为常规数据库用户并添加到db_owner角色。