SQL Server: разрешение на просмотр таблицы

Можно ли предоставить пользователю доступ к представлению, но ограничить доступ пользователя к таблице, из которой он выбирает представление?

CREATE TABLE [dbo].[tUsers](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Username] [nvarchar](50) NULL,
    [Password] [nvarchar](50) NULL,
    [TenantID] int
) ON [PRIMARY]

CREATE VIEW [scmTenant1].[vUsers]
AS
SELECT     ID, Username, Password
FROM         dbo.tUsers
WHERE        TenantID = 1

Учетная запись пользователя SQL Server (usrTenant1) имеет доступ к схеме scmTenant1, но не имеет доступа к схеме dbo. Я вхожу в SQL Server Management Studio как usrTenant1 и пытаюсь выполнить этот запрос:

SELECT * FROM scmTenant1.vUsers

Выдает мне ошибку:

В разрешении SELECT было отказано для объекта 'tUsers', базы данных 'Sandbox', схемы 'dbo'.

Если я предоставлю этой учетной записи доступ к схеме dbo, запрос будет выполнен нормально.

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


person jwdenny13    schedule 23.10.2012    source источник


Ответы (1)


Если вы сделаете владельцем представления dbo, а не scmTenant - или создадите промежуточное представление, которое делает то же самое - тогда вы можете предоставить разрешение для представления без предоставления разрешений для базовой таблицы.

ie

CREATE VIEW dbo.vUsers_T1
AS 
SELECT     ID, Username, Password 
FROM         dbo.tUsers 
WHERE        TenantID = 1

CREATE VIEW [scmTenant1].[vUsers] as
SELECT * FROM dbo.vUsers_T1

В качестве альтернативы вы можете создать функцию, которая возвращает идентификатор текущего клиента, и создать представление, которое ссылается на это в dbo.

CREATE VIEW dbo.vUsers
AS 
SELECT     ID, Username, Password 
FROM         dbo.tUsers 
WHERE        TenantID = dbo.GetCurrentTenant()
person podiluska    schedule 23.10.2012
comment
Спасибо за предложение, но я не думаю, что это сработает в моей среде. Я планирую создать схему и представление для каждого клиента в моей системе. Если я перемещу представление в dbo, тогда каждому представлению клиента потребуется уникальное имя, которое нарушит мой код. - person jwdenny13; 23.10.2012
comment
Заменил dbo.GetCurrentTenant () на SUSER_SID () и изменил таблицу, заменив TenantID на SID. Этот столбец имеет значение по умолчанию SUSER_SID (). Отлично работает, спасибо! - person jwdenny13; 23.10.2012