【发布时间】:2020-09-16 12:17:21
【问题描述】:
我知道这个问题是重复的 (Grant Select on a view not base table when base table is in a different database),但我已经尝试了建议的解决方案,但没有任何运气。
我的想法是通过我在其中创建视图的中间数据库授予对某些数据库中数据的有限访问权限。我这样做是为了避免每次创建视图时都授予对外部表的特定权限。我就是这样做的:
- 我有 User_A 和 User_B
- User_A 创建 DATABASE_A1 和 DATABASE_A2
- User_A 在 DATABASE_A1 中创建 VIEW_A,从 DATABASE_A2 读取数据
- 我在 DATABASE_A1 中将 db_dataread 角色设置为 User_B,所以他们现在可以执行 VIEW_A
- 如果 User_B 尝试执行 VIEW_A,收到消息 “服务器主体 'User_B' 无法在当前安全上下文下访问数据库 'DATABASE_A2'”,这是我的预期,因为用户对此数据库没有任何权限
- 然后我在两个数据库中激活“跨数据库所有权链接”(不确定我是否只需要在一个数据库中执行此操作),使用以下命令:
ALTER DATABASE Database_A1 SET DB_CHAINING ON;
ALTER DATABASE Database_A2 SET DB_CHAINING ON;
- 我通过运行检查链接是否处于活动状态:
SELECT is_db_chaining_on, name FROM sys.databases;
- 一切正常,因为两个数据库上的“is_db_chaining_on”值都设置为“1”
- 我重试执行视图...但一直拒绝访问,同样的错误。
我做错了什么吗?我认为我已遵循以下指示:
【问题讨论】:
-
对于 dbo 拥有的对象,对于完整的链,数据库所有者需要相同。确保数据库具有相同的所有者并使用 `ALTER AUTHORIZATION ON DATABASE::YourDatabase TO YourDbOwner;'修复
标签: sql-server