Создание пользователя SQL Server с разрешением на чтение одного представления и ничего другого, но он может видеть системные представления и процедуры?

Моя компания наняла подрядчика для выполнения небольшого проекта для нас, для которого ему нужно выбрать данные из одного представления в нашей основной базе данных (SQL Server 2005).

Я хотел создать для него заблокированный SQL Server логин с разрешениями только SELECT из «его» представления ... и ничего больше.

Итак, я создал нового пользователя на сервере, а затем дал ему разрешение только на это одно представление:

grant select on SpecialView to SpecialUser;

В принципе, это работает - он не видит ни наших таблиц и хранимых процедур, ни каких-либо представлений, кроме «своего».

Но:

  • он может получить доступ ко всем системным представлениям
  • он может получить доступ ко всем системным хранимым процедурам.

Очевидно, его права доступа автоматически блокируются (sys.objects показывает только те объекты, для которых у него есть разрешения, sp_who показывает только его собственные процессы и так далее).

Итак, мой вопрос:

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

Или есть какая-то причина, по которой даже заблокированным пользователям нужен доступ к системным представлениям и хранимым процедурам?

РЕДАКТИРОВАТЬ:
kevchadders, пользователь не имеет доступа к master, model или msdb - только к базе данных с представлением, которое он должен видеть.

Но, чтобы прояснить одну вещь: системные представления / процессы, которые может видеть пользователь, находятся в базе данных, где «его» представление ... не в главной базе данных. Поэтому я не могу отключить весь его доступ, так как ему нужно выбрать одно представление в той же базе данных.
Дело в том, что даже если я явно установил разрешение только для одного представления, которое он должен видеть, почему он по-прежнему видит системные просмотры / процессы?


person Christian Specht    schedule 16.07.2010    source источник


Ответы (3)


Используйте 1_. Вы не можете лишить пользователя возможности видеть существование представлений и хранимых процедур, но можете удалить возможность просмотра (большей части) их содержимого.

deny view definition to smallperms_role 
go
sp_addrolemember 'smallperms_role ', 'smallperms_user'
go
sp_addrolemember 'db_datareader', 'smallperms_user'
go

Например:
EXEC sys.sp_databases ничего не возвращает, но выполняется.
SELECT * FROM INFORMATION_SCHEMA.TABLES ничего не возвращает, но не возвращает ошибку.

person Darryl Peterson    schedule 16.07.2010

Щелкните пользователя правой кнопкой мыши и выберите страницу Сопоставление пользователей.

Оттуда вы пытались отключить весь его доступ к базе данных master, model и msdb?

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

Или еще лучше создать тестовый логин, чтобы поэкспериментировать с ним.

person kevchadders    schedule 16.07.2010

Я не думаю, что вы можете удалить ПУБЛИЧНЫЙ доступ для пользователя. (Из свойств пользователя)

Вы можете ОТКАЗАТЬ разрешения для ОБЩЕСТВЕННОСТИ в свойствах базы данных.

  • Щелкните правой кнопкой мыши базу данных
  • Перейти к свойствам
  • Перейти к разрешениям
  • Измените разрешения для роли ГОСТЯ.

Но вы не можете отказать в разрешении «КОНТРОЛЬ» для Master или Temp dbs, и вы не можете войти на сервер, если вы откажетесь от SELECT на MASTER.

person Talasila    schedule 16.07.2010
comment
Боюсь, дело не в этом - у нас нет роли ГОСТЯ. - person Christian Specht; 19.07.2010