Как отменить разрешение SELECT для system_views для общественности - PullRequest
0 голосов
/ 10 марта 2009

У меня есть следующий T-SQL для отображения всех разрешений, предоставленных принципалам на моем SQL-сервере 2005:

select dp.NAME AS principal_name, --1
  dp.type_desc AS principal_type_desc, --2
  o.NAME AS object_name, --3
  p.permission_name, --4
  p.state_desc AS permission_state_desc --5
from    sys.database_permissions p
  left    OUTER JOIN sys.all_objects o
  on     p.major_id = o.OBJECT_ID
  inner   JOIN sys.database_principals dp
  on     p.grantee_principal_id = dp.principal_id
order by principal_name, object_name

Результат отображает общедоступный с предоставленным SELECT:

 1      2             3            4      5
 ...
 public DATABASE_ROLE system_views SELECT GRANT
 ....

Я думаю, имя_объекта system_views предназначено для всех представлений в моей базе данных. Представления | папка system_views. Я попробовал следующий T-SQL (просто чтобы проверить, работает ли он снова GRANT):

GRANT SELECT ON system_views TO public

Я получил ошибку "Не удается найти объект 'system_views', потому что он не существует или у вас нет разрешения». Я подключаю SQL-сервер как sa.

Мой вопрос заключается в том, как отозвать разрешение SELECT для system_views для общего доступа (пользователя или участника?) И отменить разрешение, если потребуется. Второй вопрос: есть ли у отзыва system_views для public какой-либо побочный эффект для других пользователей?

Ответы [ 3 ]

1 голос
/ 31 марта 2009

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

Если вы хотите предоставить пользователю право видеть все объекты в базе данных, тогда предоставьте им определение вида в схеме или базе данных.

0 голосов
/ 11 марта 2009

public - это роль " special ". Не связывайтесь с этим. Каждый пользователь по умолчанию является публичным, например.

Видимость метаданных фактически определяет то, что видит пользователь. Поэтому, даже если кто-то сделает SELECT * FROM sys.columns, он увидит только столбцы для объектов, на которые у него есть права. Никаких других прав = только информация о столбцах для системных представлений.

Если вы сделаете это, вы, вероятно, сломаете что-либо, особенно в SSMS или клиентах прямого доступа (Access, Excel и т. Д.)

0 голосов
/ 11 марта 2009

выберите * из sys.system_views

Есть ли у публики VIEW DEFINITION по любому из них?

Я бы настоятельно рекомендовал не шутить с этим.

Вы могли бы просто

DENY VIEW DEFINITION ON SCHEMA::DBO TO PUBLIC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...