SQL Server - предоставьте разрешение на вход в систему для доступа на чтение ко всем существующим и будущим базам данных - PullRequest
7 голосов
/ 23 августа 2010

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

Есть ли способ, с помощью которого я могу предоставить логину доступ на чтение ко всем базам данных и ко всем будущим базам данных, т. Е. Мне не придется ничего делать при добавлении новой базы данных?роль сервера, которая будет работать?Есть ли способ заставить задание агента SQL добавить разрешения для любых новых баз данных?Или есть какой-то другой метод?

Ответы [ 2 ]

9 голосов
/ 23 августа 2010

Для новых баз данных добавьте пользователя в базу данных модели.Это используется в качестве шаблона для всех новых баз данных.

USE model
CREATE USER ... FROM LOGIN...
EXEC sp_addrolemember 'db_datareader', '...'

Для существующих баз данных используйте sp_MSForEachDb

EXEC sp_MSForEachDb '
 USE ?
 CREATE USER ... FROM LOGIN...  
 EXEC sp_addrolemember ''db_datareader'', ''...''
'
1 голос
/ 12 июля 2013

ИСПОЛЬЗОВАТЬ [master] GO --IF НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ИЗ СИГЛОГИНОВ, где loginname = 'заменить на имя входа') --CREATE LOGIN [заменить на имя входа] FROM WINDOWS WITH DEFAULT_DATABASE = [master] --GO DECLARE@SQL VARCHAR (MAX) DECLARE @DatabaseName VARCHAR (255)

ОБЪЯВЛЯЕТ CURSET CURSOR FOR - ВЫБРАТЬ ИМЯ ИЗ SYSDATABASES ГДЕ имя в - ('master', 'model', 'tempdb', 'msdb', 'distribution')

ВЫБЕРИТЕ ИМЯ ИЗ SYS.DATABASES, ГДЕ нет имени ('master', 'model', 'tempdb', 'msdb', 'distribution')

OPEN crFetchFETCH NEXT FROM crFetch INTO @ DatabaseName

WHILE @@ FETCH_STATUS <> -1 BEGIN

SET @SQL =

'USE [' + @DatabaseName + ']' +'если не существует (выберите имя из sysusers, где name =' + '' '' + 'замените на имя пользователя' + '' '' + ')' + 'CREATE USER [замените имя пользователя] FOR LOGIN [замените имя пользователя Loginname] '+' EXEC sp_addrolemember N '+' '' '+' db_ETL '+' '' '+', N '+' '' '+' заменить на Имя для входа '+' '' '+' '

- 'EXEC sp_addrolemember N '+' '' '+' db_datareader '+' '' '+', N '+' '' '+' замените именем входа '+' '' '+ -, если не существует (выберите имя изsysusers где name = '+' '' '+' db_executor '+' '' '+' и issqlrole = 1) '+ -' create ROLE db_executor '+' '+ -' GRANT EXECUTE TO db_executor '+' '+ - 'EXEC sp_addrolemember N' + '' '' + 'db_executor' + '' '' + ', N' + '' '' + 'заменить на Имя для входа' + '' '' + '

- PRINT @ SQL

EXEC (@SQL)

ПОЛУЧИТЬ СЛЕДУЮЩИЙ ИЗ crFetch INTO @DatabaseName END

ЗАКРЫТЬ crFetch DEALLOCATE crFetch

...