如何授予用户访问视图但不授予视图正在使用的 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
角色。
guest 在 msdb 数据库上启用。
当我执行视图时出现以下错误:
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 拥有的对象,这需要:
- 两个数据库都打开了 DB_CHAINING 选项(默认打开
在 msdb 中)
- 数据库具有相同的所有者('sa' 是 msdb 的默认所有者)
- 用户在另一个数据库中有一个安全上下文(来宾是
在 msdb 中默认启用)
因此,下面的脚本应该可以完成这项工作。
ALTER DATABASE myCustomDatabase SET DB_CHAINING ON;
ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;
请注意,仅当您信任有权创建 dbo 拥有的对象的特权用户时,才应在 sa 拥有的数据库中启用 DB_CHAINING。如果只有 sysadmin 角色成员可以创建对象,那么这不是一个考虑因素。此外,如果旧所有者不是 sysadmin 角色成员并且您需要该登录名来保留 dbo 权限,请将旧所有者添加为常规数据库用户并添加到 db_owner 角色。
我已将以下视图定义到 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'.
我了解我当前的用户在系统数据库中没有定义角色。
我应该给我的当前用户提供哪个 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 拥有的对象,这需要:
- 两个数据库都打开了 DB_CHAINING 选项(默认打开 在 msdb 中)
- 数据库具有相同的所有者('sa' 是 msdb 的默认所有者)
- 用户在另一个数据库中有一个安全上下文(来宾是 在 msdb 中默认启用)
因此,下面的脚本应该可以完成这项工作。
ALTER DATABASE myCustomDatabase SET DB_CHAINING ON;
ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;
请注意,仅当您信任有权创建 dbo 拥有的对象的特权用户时,才应在 sa 拥有的数据库中启用 DB_CHAINING。如果只有 sysadmin 角色成员可以创建对象,那么这不是一个考虑因素。此外,如果旧所有者不是 sysadmin 角色成员并且您需要该登录名来保留 dbo 权限,请将旧所有者添加为常规数据库用户并添加到 db_owner 角色。