【问题标题】:Grant permission for a view that uses tables form other databases授予使用来自其他数据库的表的视图的权限
【发布时间】: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,收到消息 “服务器主体 'Us​​er_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”
  • 我重试执行视图...但一直拒绝访问,同样的错误。

我做错了什么吗?我认为我已遵循以下指示:

Ownership Chaining

cross db ownership chaining Server Configuration Option

Enabling Cross-Database Access in SQL Server

【问题讨论】:

  • 对于 dbo 拥有的对象,对于完整的链,数据库所有者需要相同。确保数据库具有相同的所有者并使用 `ALTER AUTHORIZATION ON DATABASE::YourDatabase TO YourDbOwner;'修复

标签: sql-server


【解决方案1】:

您需要在其他数据库中创建用户(不授予任何权限)。

USE [DATABASE_A2]
GO
CREATE USER [User_B] FOR LOGIN [User_B]
GO

【讨论】:

  • 就是这样!谢谢!
【解决方案2】:

对于 dbo 拥有的对象,数据库所有者需要相同,才能维持完整的所有权链。确保数据库具有相同的所有者并使用ALTER AUTHORIZATION ON DATABASE::YourDatabase TO YourDbOwner; 进行修复。对于其他模式中的对象,每个数据库中的模式所有者需要映射到同一个登录。

用户还需要在每个访问的数据库中都有一个帐户(除非启用了来宾用户)。但是,不需要对间接引用的对象授予权限。

【讨论】:

  • 谢谢!我只需要在 DATABASE_A2 中创建用户 User_B。
猜你喜欢
  • 2016-12-14
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
相关资源
最近更新 更多