Я шукаю найкращий спосіб відключити доступ до sys.tables
/ Information Schema
для користувача / групи в SQL Server.
Я знайшов цю тему з 2008 року
Він показує спосіб, як заборонити доступ [sys].[something]
так:
DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
GO
Але жодним чином, як відключити доступ на Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Це, здається, не працює.
Як я можу відключити доступ до information_schema?
А чи є простіший спосіб відключити доступ до всіх sys
/ information_schema
?
Оновлення: Насправді я не можу запустити обидва наступні твердження:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
Я спробував запустити їх на конкретній БД, де існує Користувач, а також спробував на "master".
Я ще можу бігати:
SELECT * from
INFORMATION_SCHEMA.TABLES
-> все одно повертає результати
SELECT * from
sys.TABLES
-> результатів більше немає
Включення SCHEMA::
в запит дозволило створити захисні засоби
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
Але тепер я все ще можу вибрати всю інформацію з БД.
Я переглянув "Securables" -Tab у користувальницькому вікні "Properties-window" в Management Studio 2008, це виглядає приблизно так:
Запис, який блокує вибір вибору sys.tables
Схема: sys, Ім'я: таблиці, Тип: Вид
Дозволи для sys.tables: Дозвіл: Виберіть, Грант: dbo, Відхилено
Запис, який не блокує жодного вибору
Схема :, Назва: INFORMATION_SCHEMA, Тип: Схема
Дозволи для INFORMATION_SCHEMA: Дозвіл: Виберіть, Грант: dbo, Заборонено НЕ перевірено (я намагався це перевірити, але шансів немає).
Дозвіл: Виберіть, Контрактор: INFORMATION_SCHEMA, Відхилено
Я спробував встановити дозволи над графічним інтерфейсом, але потім я отримав ту саму помилку, що встановлення дозволів було б можливим лише у головній БД. Але я не додав користувача / логін до основного захисту БД.
Рішення:
Єдиний спосіб, яким я міг би зробити deny
роботу для, це information_schema
- додати користувача до master-db та запустити deny select
на master:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
І як у цьому коді, він може бути виконаний лише для одиночних таблиць.