Предоставить разрешение SELECT для представления, но не для базовых объектов - PullRequest
24 голосов
/ 09 ноября 2010

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

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

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

Ответы [ 3 ]

22 голосов
/ 09 ноября 2010

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

3 голосов
/ 13 января 2016

Если ваши представления в схеме, отличной от таблицы, вы должны либо предоставить пользователю доступ к базовой таблице, «АВТОРИЗАЦИЯ» владельца таблиц в представлении, например:

ALTER AUTHORIZATION ON reporting.MyViewName TO dbo

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

2 голосов
/ 09 ноября 2010

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

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

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;

К вашему сведению - для хранимых процедур вы должны предоставить EXEC для этой процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...