Как предоставить пользователю доступ к представлению, но не к таблице, которую использует представление?
У меня есть следующее представление, определенное в myCustomDatabase:
CREATE VIEW myCustomDatabase.dbo.myView AS
SELECT job_id FROM msdb.dbo.sysjobhistory
Владелец myCustomDatabase - sa.
Мой текущий пользователь (называемый currentUser) имеет только db_reader
роль в базе данных myCustomDatabase.
Гость включен в базе данных MSDB.
Когда я выполняю представление, я получаю следующую ошибку:
The SELECT permission was denied on the object 'sysjobhistory', database 'msdb', schema 'dbo'.
Я понимаю, что мой текущий пользователь не имеет роли, определенной в системной базе данных.
Какую роль / авторизацию я должен дать своему текущему пользователю, чтобы он мог выполнять представление (которое содержит только один столбец из системного), но не предоставлять ему полный доступ к таблице.
Для возобновления работы следующее представление должно работать при вызове с currentUser:
CREATE VIEW myCustomDatabase.dbo.myView AS
SELECT job_id FROM msdb.dbo.sysjobhistory
, но не следующий запрос:
SELECT * FROM msdb.dbo.sysjobhistory
Изменить: просмотр таблиц в MSDB
Edit2: моя версия SQLServer 2008
1 ответ
Вам не нужно предоставлять разрешения для таблиц, на которые ссылается представление, если цепочка владения не нарушена. В случае объектов, принадлежащих dbo в разных базах данных, это требует, чтобы:
- в обеих базах данных включена опция DB_CHAINING (по умолчанию в msdb)
- базы данных имеют одного и того же владельца (sa по умолчанию является владельцем msdb)
- у пользователя есть контекст безопасности в другой базе данных (гостевой режим включен по умолчанию в msdb)
Следовательно, следующий скрипт должен сделать эту работу.
ALTER DATABASE myCustomDatabase SET DB_CHAINING ON;
ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa;
Обратите внимание, что вы должны включить DB_CHAINING в базах данных, принадлежащих sa, только если вы доверяете привилегированным пользователям с разрешениями на создание объектов, принадлежащих dbo. Это не имеет значения, если только члены роли sysadmin могут создавать объекты в любом случае. Кроме того, если старый владелец не является участником роли sysadmin и вам нужен этот логин для сохранения разрешений dbo, добавьте старого владельца как обычного пользователя базы данных и добавьте в роль db_owner.