我在 myCustomDatabase 中定义了以下视图:
CREATE VIEW myCustomDatabase.dbo.myView AS
SELECT job_id FROM msdb.dbo.sysjobhistory
myCustomDatabase 的所有者是 sa 。
我当前的用户(名为 currentUser )在 myCustomDatabase 上只有db_reader
个角色。
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中的可查看表
Edit2:我的SQLServer版本是2008
答案 0 :(得分:2)
只要所有权链未中断,您就不需要为视图引用的表授予权限。对于不同数据库中dbo拥有的对象,这需要:
因此,以下脚本应该完成这项工作。
ALTER DATABASE myCustomDatabase SET DB_CHAINING ON;
ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;
请注意,仅当您信任具有创建dbo拥有对象权限的特权用户时,才应在sa拥有的数据库中启用DB_CHAINING。如果只有sysadmin角色成员可以创建对象,那么这不是一个考虑因素。此外,如果旧所有者不是sysadmin角色成员,并且您需要该登录以保留dbo权限,请将旧所有者添加为常规数据库用户并添加到db_owner角色。