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

15

Я предоставляю разрешение «Просмотр любой базы данных» при создании новой роли сервера, но понял, что это разрешение позволяет только пользователю просматривать системные базы данных.

Я пытаюсь создать роль сервера, которая доступна только для чтения и может читать любую базу данных.

Есть ли способ создать пользовательскую роль сервера для чтения пользовательских баз данных? Или я должен сделать это через сопоставление пользователей для каждого пользователя?

Joha
источник

Ответы:

16

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

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

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Первый, как это звучит, позволяет логину подключаться к любой базе данных. Приятно то, что это разрешено даже для баз данных, которые будут созданы в будущем (при условии, что вы не установили явное запрещение, то есть как вы можете защитить определенные пользовательские базы данных от входов в систему, имеющих это разрешение). Последний позволяет входу в систему выполнять операции чтения в любой базе данных, к которой у него есть доступ - так что они могут это делать SELECTиз таблиц, представлений, пользовательских функций и т. Д., Но они не смогут выполнять никаких 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 Нет, не могу придумать ни одного тривиального способа сделать это, извините.
Аарон Бертран
ПОЭТОМУ это не будет работать для базы данных SQL Azure. GRANT ПОДКЛЮЧИТ ЛЮБУЮ БАЗУ ДАННЫХ [NameOfUserOrGroup] Защищаемый класс 'server', не поддерживаемый в этой версии SQL Server.
Дзеймс
8

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

Так что да, вам придется сопоставлять пользователей с базами данных индивидуально. Если вы используете Active Directory, вы можете создать группу Windows, затем дать этой группе логин для SQL Server, а затем применить db_datareader во всех базах данных для этой группы (вам нужно будет создать пользователей в каждой базе данных).

Саймон Ригартс
источник