2010-08-23 7 views
7

Tengo un procedimiento almacenado que encuentra todas las bases de datos existentes y las lecturas de una tabla en cada una.Servidor SQL: otorgue un permiso de inicio de sesión para acceso de lectura a todas las bases de datos existentes y futuras

¿Hay alguna manera de que pueda dar acceso de acceso de inicio de sesión a todas las bases de datos y a todas las bases de datos futuras, es decir, no tendré que hacer nada cuando se agregue una nueva base de datos?

¿Hay alguna función de servidor que funcione? ¿Hay alguna manera de hacer que un trabajo de agente SQL agregue los permisos en cualquier base de datos nueva? ¿O hay algún otro método?

Respuesta

9

Para bases de datos nuevas, agregue el usuario en la base de datos modelo. Esto se usa como la plantilla para todas las nuevas bases de datos.

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

Para bases de datos existentes, utilice sp_MSForEachDb

EXEC sp_MSForEachDb ' 
USE ? 
CREATE USER ... FROM LOGIN... 
EXEC sp_addrolemember ''db_datareader'', ''...'' 
' 
+0

Será el usuario de forma automática obtener acceso de lectura después de ejecutar que ? – Greg

+0

Bueno, también deberá otorgar algunos derechos, pero tendrán acceso DB – gbn

+0

¿Cómo puedo automatizar la concesión de derechos de lectura a las tablas? De lo contrario, estoy un poco de vuelta donde comencé. – Greg

1

USO [maestro] GO -si no existe (SELECT * FROM syslogins donde LoginName = 'reemplazar con el nombre de sesión') - CREATE LOGIN [reemplazar con el nombre de sesión] DESDE WINDOWS cON DEFAULT_DATABASE = [maestro] --ir DECLARE @SQL VARCHAR (MAX) DECLARE @DatabaseName VARCHAR (255)

DECLARE CURSOR crFetch PARA NOMBRE --Seleccionar DE SYSDATABASES DONDE nombre en - ('maestro', 'modelo', 'tempdb', 'msdb', 'distribución')

SELECT NOMBRE DE SYS.Bases de datos donde nombre no en (, 'modelo' 'master', 'tempdb', 'msdb', 'distribución')

OPEN crFetch FETCH DESPUÉS de crFetch EN @DatabaseName

WHILE @@ FETCH_STATUS < > -1 COMENZAR

SET @SQL =

'USO [' + @DatabaseName + ']' + 'si no existe (seleccione el nombre desde sysusers donde name =' + '' '' + ' reemplace con Nombre de inicio de sesión '+' '' '+') '+ ' CREAR USUARIO [r eplace con Nombre de usuario] PARA INICIAR SESIÓN [reemplazar con Nombre de inicio de sesión] '+ ' EXEC sp_addrolemember N '+' '' '+' db_ETL '+' '' '+', N '+' '' '+' reemplazar con Inicio de sesión nombre de '+ ''' '+' '

-' sp_addrolemember EXEC n '+ '' '' + 'db_datareader' + '' '' +', N '+ '' '' +' reemplazar con Nombre de inicio de sesión '+' '' '+ -' si no existe (seleccione el nombre de sysusers donde name = '+' '' '+' db_executor '+' '' '+' y issqlrole = 1) '+ - -'create ROLE db_executor '+' '+ -' GRANT EJECUTAR A db_executor '+' '+ -' EXEC sp_addrolemember N '+' '' '+' db_executor '+' '' '+', N ' + '' '' + 'reemplazar con Nombre de inicio de sesión' + '' '' + '

--print @SQL

EXEC (@SQL)

FETCH DESPUÉS de crFetch EN @DatabaseName FIN

crFetch CERRAR DEALLOCATE crFetch

Cuestiones relacionadas