Подтвердить что ты не робот

Предоставить разрешение SELECT для представления, но не для базовых объектов

Я часто читал, что одной целью VIEW является безопасность: разрешить некоторым пользователям доступ к базовой таблице и другим пользователям только к производному виду. Имея это в виду, я разработал несколько представлений, которые предоставляют ограниченные наборы данных для внешних пользователей.

Все очень хорошо, но на практике это не работает. После того как я предоставил разрешение SELECT для представления, пользователи не смогут получить к нему доступ, если я не предоставил SELECT для всех базовых объектов. Такая же история хранимых процедур. Чистый результат не работает, поскольку я в конечном итоге все же предоставляю доступ к конфиденциальным данным не тем пользователям, а также раздражает, так как легко забыть один объект, и пользователи возвращаются, чтобы жаловаться на то, что представление "не работа".

Есть ли способ предоставить разрешения SELECT для представления или хранимой процедуры, не выставляя также скрытые объекты?

4b9b3361

Ответ 1

Имеет ли тот же пользователь, которому принадлежит представление, собственные таблицы? Если нет, то владелец таблиц должен предоставить разрешение владельца просмотра WITH GRANT OPTION. Если одному и тому же пользователю принадлежат как таблицы, так и представление, то предоставление разрешения на представление должно быть достаточным.

Ответ 2

Вы можете найти информацию в этом форуме.

Последнее сообщение содержит сведения о том, что было выполнено для предоставления разрешений для представления, но не для основных таблиц:

CREATE USER [Reports] FOR LOGIN [Reports] WITH DEFAULT_SCHEMA = Reports
CREATE SCHEMA Reports AUTHORIZATION Reports --Auth as Reports was the key piece of information that I had missed.
GO
CREATE ROLE Reporting AUTHORIZATION db_securityadmin
GO
exec sp_addrolemember @rolename = 'Reporting', @membername = 'Reports'
GO
GRANT CREATE VIEW TO Reporting
GRANT CREATE TABLE TO Reporting

GRANT SELECT, VIEW DEFINITION ON [dbo].[zName] TO Reporting;

FYI - для хранимых процедур вы должны предоставить EXEC процедуре.

Ответ 3

Если у вас есть ваши представления в другой схеме, чем в таблице, вы должны либо предоставить пользователю доступ к базовой таблице, "УПОЛНОИТЕ" владельца таблиц в виде следующим образом:

ALTER AUTHORIZATION ON reporting.MyViewName TO dbo

В приведенном выше примере dbo пользователь, владеющий таблицами, к которому обращается reporting.MyViewName