Як створити роль сервера лише для читання на SQL Server 2012?


15

Я надаю дозвіл "Перегляд будь-якої бази даних" під час створення нової ролі сервера, але зрозумів, що цей дозвіл дозволяє користувачеві лише переглядати системні бази даних.

Я намагаюся створити роль сервера, яка є лише для читання і може читати будь-яку базу даних.

Чи існує спосіб створити визначену користувачем роль сервера для читання баз даних користувачів? Або я повинен це зробити за допомогою картографування користувачів на кожного користувача?

Відповіді:


16

Опублікуйте це як відповідь лише тому, що це занадто довго для коментарів, і тому, що воно буде відносно інших користувачів досить скоро.

SQL Server 2014 додає нові дозволи на рівні сервера, які допоможуть точно використовувати такий тип сценаріїв - вони були розроблені з урахуванням аудиту, але цей тип вимог, як видається, відповідає і цьому законопроекту. Ви можете просто додати наступні два дозволи до входу на рівні сервера:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Колишній, як це звучить, дозволяє логіну підключитися до будь-якої бази даних. Приємно в тому, що це дозволить це навіть для баз даних, які створюються в майбутньому (за умови, що ви не встановлюєте явного заперечення, тобто ви можете захистити певні бази даних від логінів, які мають цей дозвіл). Останнє дозволяє логіну виконувати операції зчитування в будь-якій базі даних, до якої вони мають доступ - тому вони можуть робити SELECTз таблиць, представлень даних, UDF тощо, але вони не зможуть виконувати жодних UPDATEоперацій (я не перевіряв, чи розуміє цей дозвіл, коли збережена процедура виконує DML). Вони чудово працюють в поєднанні, якщо ви хочете надати широко відкритий доступ для читання для входу на весь сервер або бути більш точним, ви можете надати традиційні CONNECTпривілеї певним базам даних, і SELECT ALL USER SECURABLESправильно будефункція лише для тих баз даних, до яких вхід має явний доступ.

Зміни безпеки 2014 року тут задокументовані - ну частково; вони забули про дозвіл на рівні бази даних, ALTER ANY DATABASE EVENT SESSIONхоча це тут не актуально.


Дякуємо за цю розширену відповідь на майбутніх серверах. Оскільки ця операція / перевірка знаходиться на рівні сервера. Чи є коментарі щодо рівня сумісності БД. Отже, якщо DB CL 2012 року, чи функція 2014 року все ще працюватиме?
SnapJag

@SnapJag Рівень сумісності не має ніякого відношення до особливостей безпеки, це здебільшого про те, як T-SQL розбирається та як оптимізатор генерує плани запитів.
Аарон Бертран

@AaronBertrand Чи знаєте ви, чи є дозвіл, який ми можемо встановлювати на ролях рівня сервера, щоб також можна було оновлювати будь-яку базу даних? (Фіксована роль sysadmin може точно, але чи можемо ми це зробити для визначеної користувачем ролі сервера?)
MaxiWheat

@MaxiWheat Ні, не можу придумати жодного тривіального способу зробити це, вибачте.
Аарон Бертран

FWIW це не буде працювати для бази даних SQL Azure. ВИДАЛУЙТЕ ПІДКЛЮЧИТИ БУДЬ-ЯКІ ДАНІ НА [NameOfUserOrGroup] Відокремлений сервер класу, який не підтримується в цій версії SQL Server.
Dzejms

8

Немає дозволу "читати будь-яку базу даних" на рівні сервера, і ролі на рівні сервера не можуть надавати дозволи на рівні бази даних

Так що так, вам доведеться окремо відображати користувачів до баз даних. Якщо ви використовуєте Active Directory, ви можете створити групу Windows, а потім надати цій групі вхід на SQL Server, а потім застосувати db_datareader у всіх базах даних для цієї групи (вам потрібно створити користувачів у кожній базі даних).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.