2015-01-16 4 views
0

Я следующий вид определяется в myCustomDatabase:Как предоставить пользователю доступ к представлению, но не к таблице, которую использует вид?

CREATE VIEW myCustomDatabase.dbo.myView AS 
    SELECT job_id FROM msdb.dbo.sysjobhistory 

myCustomDatabase владелец «s является са.

Мой текущий пользователь (так называемый CurrentUser) имеет только db_reader роль на myCustomDatabase.

гость is on on 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 

Edit: видимые таблицы в MSDB


Edit2: Моя SQLServer версия 2008

ответ

2

Вам не нужно предоставлять разрешения на доступ к таблицам, на которые ссылается зрения, пока цепочка владения не убавляется. В случае ПСЭ собственности объектов в различных базах данных, это требует, чтобы:

  1. обе базы данных имеют возможность DB_CHAINING включена (по умолчанию в MSDB)
  2. базы данных имеют один и тот же владелец («са» является владельцем по умолчанию MSDB)
  3. пользователя имеет контекст безопасности в другой базе данных (гость по умолчанию включен в MSDB)

Следовательно, следующий скрипт должен делать эту работу.

ALTER DATABASE myCustomDatabase SET DB_CHAINING ON; 
ALTER AUTHORIZATION ON DATABASE::myCustomDatabase TO sa; 

Обратите внимание, что вы должны позволить DB_CHAINING в Нес принадлежащих базам данных, только если вы доверяете привилегированных пользователей с правами доступа для создания DBO собственности объектов. Это не рассмотрение, если только члены роли sysadmin могут создавать объекты в любом случае.Кроме того, если старый владелец не является членом роли sysadmin и вам нужен этот логин, чтобы сохранить разрешения dbo, добавьте старого владельца в качестве обычного пользователя базы данных и добавьте роль db_owner.

+0

Моя пользовательская база данных не принадлежит * sa * пользователю, если я устанавливаю * sa * в качестве владельца, как вы предлагаете, может ли он нарушить некоторые существующие правила доступа? – Fractaliste

+0

@Fractaliste, я добавил дополнительную информацию к своему сообщению. Это также можно выполнить с помощью сертификатов. Я добавлю дополнительную информацию об этом методе, если вы укажете, какую версию SQL Server вы используете. –

+0

Если обе базы данных находятся в собственности, мне не нужно выполнять 'ALTER AUTHORIZATION ON DATABASE :: myCustomDatabase TO sa;' не так ли? – Fractaliste