【发布时间】:2019-10-31 22:41:52
【问题描述】:
我有一个 SQL Server 2017 实例,上面有 5 个数据库。 A、B、C、D、E。数据库 A 只包含模式和视图。实例上的每个后续数据库(A、B、C、D、E)都有一个架构,每个架构拥有 50 - 150 个视图。
我需要能够授予用户对数据库 A 中所有视图的选择权限,但直接拒绝对所有表的选择权限。
测试条件应如下所示。
SELECT * FROM [B].dbo.[any_table] (DENIED)
SELECT * FROM [A].[B].some_view (WORKS)
由于架构 A - E 都归 dbo 所有,我认为我可以执行以下操作:
USE A
GO
CREATE ROLE db_viewreader
GO
GRANT SELECT ON SCHEMA::A TO db_viewreader (repeat for b, c, d, e)
GO
CREATE USER testuser WITHOUT LOGIN
GO
ALTER ROLE db_viewreader ADD MEMBER testuser
GO
EXECUTE AS USER = 'testuser'
SELECT *
FROM [A].[B].some_view
我无法从视图或表格中获取结果。我想我明白为什么我没有得到查询表的结果,因为我创建的用户在数据库 B - E 中不存在。这是否与我不能调用访问这些基础表中数据的视图的原因相同?如果是这样,我有什么方法可以创建一个可以利用视图但不能利用它们所在的表的用户?
【问题讨论】:
-
1) 在所有 5 个数据库中创建 testuser。 2) 在所有 5 个数据库中启用
DB_CHAINING。 3) 确保所有 5 个数据库都归同一个用户所有。 4)在数据库A视图上授予SELECT(不需要DENY)。
标签: sql sql-server database-security