授予使用其他数据库表的视图的权限

时间:2020-09-16 12:17:21

标签: sql-server

我知道这个问题是重复的(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,该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”
  • 我重试执行视图...但是继续拒绝访问,同样的错误。

我在做错什么吗?我已遵循以下指示:

Ownership Chaining

cross db ownership chaining Server Configuration Option

Enabling Cross-Database Access in SQL Server

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

对于dbo拥有的对象,数据库所有者必须相同,以维护完整的所有权链。确保数据库具有相同的所有者,并使用ALTER AUTHORIZATION ON DATABASE::YourDatabase TO YourDbOwner;进行修复。对于其他架构中的对象,每个数据库中的架构所有者都需要映射到相同的登录名。

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