Публикация этого в качестве ответа только потому, что это слишком долго для комментария, и потому что это будет актуально для других пользователей довольно скоро.
SQL Server 2014 добавляет некоторые новые разрешения на уровне сервера, которые помогут именно с этим типом сценария - они были разработаны с учетом аудита, но этот тип требований, по-видимому, также соответствует этому требованию. Вы можете просто добавить следующие два разрешения для входа на уровне сервера:
CONNECT ANY DATABASE
SELECT ALL USER SECURABLES
Первый, как это звучит, позволяет логину подключаться к любой базе данных. Приятно то, что это разрешено даже для баз данных, которые будут созданы в будущем (при условии, что вы не установили явное запрещение, то есть как вы можете защитить определенные пользовательские базы данных от входов в систему, имеющих это разрешение). Последний позволяет входу в систему выполнять операции чтения в любой базе данных, к которой у него есть доступ - так что они могут это делать SELECT
из таблиц, представлений, пользовательских функций и т. Д., Но они не смогут выполнять никаких UPDATE
операций (я не проверял, понимает ли это разрешение, когда хранимая процедура выполняет DML). Они отлично работают в комбинации, если вы хотите предоставить логину доступ к чтению для всего сервера или быть более детализированным, вы можете предоставить традиционные CONNECT
привилегии определенным базам данных, и SELECT ALL USER SECURABLES
право будетФункция только для тех баз данных, к которым у входа есть явный доступ.
В 2014 году изменения в системе безопасности задокументированы здесь - ну, частично; они забыли о разрешении на уровне базы данных ALTER ANY DATABASE EVENT SESSION
- хотя это здесь не актуально.
На уровне сервера нет разрешения на чтение любой базы данных, а роли уровня сервера не могут быть предоставлены на уровне базы данных.
Так что да, вам придется сопоставлять пользователей с базами данных индивидуально. Если вы используете Active Directory, вы можете создать группу Windows, затем дать этой группе логин для SQL Server, а затем применить db_datareader во всех базах данных для этой группы (вам нужно будет создать пользователей в каждой базе данных).
источник