У меня есть экземпляр 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. По этой же причине я не могу вызвать представление, которое обращается к данным в этих базовых таблицах? Если да, то есть ли способ создать пользователя, который будет использовать представления, но не таблицы, над которыми они расположены?