logo Фёдор Самородов

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

Если ‎пользователь‏ ‎не ‎является ‎администратором, ‎то ‎незачем‏ ‎ему ‎показывать‏ ‎все‏ ‎базы ‎данных, ‎имеющиеся‏ ‎на ‎сервере.‏ ‎Разумно ‎было ‎бы ‎показывать‏ ‎пользователю‏ ‎только ‎те‏ ‎базы, ‎которые‏ ‎ему ‎нужны ‎и ‎к ‎которым‏ ‎у‏ ‎него ‎есть‏ ‎доступ.

Хорошо ‎быть‏ ‎администратором. ‎Подключаемся ‎к ‎серверу, ‎разворачиваем‏ ‎список‏ ‎баз‏ ‎данных ‎и‏ ‎до ‎каждой‏ ‎базы ‎нам‏ ‎есть‏ ‎дело!

А ‎в‏ ‎сценариях ‎хостинга ‎или ‎персональной ‎аналитики‏ ‎обычно ‎другая‏ ‎картина.‏ ‎Разворачиваем ‎огромный ‎список‏ ‎баз ‎и‏ ‎листаем, ‎листаем, ‎листаем ‎его‏ ‎в‏ ‎поисках ‎той‏ ‎единственной, ‎к‏ ‎которой ‎у ‎нас ‎есть ‎доступ.

Вот‏ ‎один‏ ‎из ‎наших‏ ‎учебных ‎серверов.‏ ‎У ‎каждого ‎пользователя ‎есть ‎своя‏ ‎база‏ ‎данных,‏ ‎в ‎которой‏ ‎он ‎—‏ ‎полноправный ‎хозяин.‏ ‎Есть‏ ‎также ‎несколько‏ ‎баз, ‎в ‎которые ‎пользователь ‎может‏ ‎заглянуть ‎с‏ ‎ограниченными‏ ‎правами. ‎А ‎к‏ ‎большинству ‎баз‏ ‎данных ‎у ‎пользователя ‎вообще‏ ‎нет‏ ‎никакого ‎доступа.‏ ‎Но ‎все‏ ‎эти ‎факторы ‎не ‎принимаются ‎во‏ ‎внимание‏ ‎SQL-сервером, ‎мы‏ ‎всё ‎равно‏ ‎видим ‎весь ‎список:

Давайте ‎посмотрим, ‎что‏ ‎тут‏ ‎можно‏ ‎придумать.

Пользователь ‎«Фёдор‏ ‎Самородов», ‎подключившись,‏ ‎видит ‎список‏ ‎баз‏ ‎данных ‎благодаря‏ ‎тому, ‎что ‎у ‎роли ‎public есть‏ ‎разрешение ‎VIEW‏ ‎ANY‏ ‎DATABASE.

Вы ‎можете ‎это‏ ‎разрешение ‎отозвать‏ ‎(тогда ‎это ‎изменит ‎картину‏ ‎для‏ ‎всех ‎пользователей),‏ ‎либо ‎запретить‏ ‎индивидуально ‎для ‎некоторых ‎пользователей. ‎Попробуем‏ ‎запретить‏ ‎просмотр ‎этих‏ ‎метаданных ‎для‏ ‎нашего ‎пользователя:

Это ‎сработало! ‎Правда, ‎стало‏ ‎ещё‏ ‎хуже‏ ‎— ‎теперь‏ ‎мы ‎не‏ ‎видим ‎вообще‏ ‎никаких‏ ‎баз, ‎кроме‏ ‎master и ‎tempdb.

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

К ‎сожалению, ‎добиться ‎желаемой‏ ‎гибкости‏ ‎мы ‎не‏ ‎сможем. ‎В‏ ‎общем ‎случае ‎такая ‎задача ‎не‏ ‎решаема.‏ ‎SQL‏ ‎Server ‎покажет‏ ‎нам ‎только‏ ‎те ‎базы,‏ ‎владельцами‏ ‎которых ‎мы‏ ‎являемся. ‎Причём, ‎учитывается ‎именно ‎фактор‏ ‎владения, ‎членства‏ ‎в‏ ‎роли ‎db_owner недостаточно.

На ‎практике‏ ‎это ‎означает,‏ ‎что ‎вы ‎сможете ‎ограничить‏ ‎видимость‏ ‎баз ‎данных‏ ‎только ‎в‏ ‎тех ‎сценариях, ‎когда ‎пользователи ‎сами‏ ‎владеют‏ ‎своими ‎персональными‏ ‎базами.

Сделаем ‎пользователя‏ ‎владельцем ‎одной ‎из ‎баз:

А ‎теперь‏ ‎обновим‏ ‎список:

Или‏ ‎выполним ‎аналогичный‏ ‎запрос ‎к‏ ‎sys.Databases:

Вот ‎это‏ ‎уже‏ ‎похоже ‎на‏ ‎то, ‎что ‎мы ‎задумали, ‎и‏ ‎это ‎—‏ ‎лучшее,‏ ‎чего ‎мы ‎можем‏ ‎добиться ‎в‏ ‎текущих ‎версиях ‎SQL-сервера.

Предыдущий Следующий
Все посты проекта
0 комментариев

Подарить подписку

Будет создан код, который позволит адресату получить бесплатный для него доступ на определённый уровень подписки.

Оплата за этого пользователя будет списываться с вашей карты вплоть до отмены подписки. Код может быть показан на экране или отправлен по почте вместе с инструкцией.

Будет создан код, который позволит адресату получить сумму на баланс.

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

Добавить карту
0/2048