2010-06-21 28 views

Respuesta

17

Una forma sería la de Ajuste "Resultados de texto" en el menú consulta en SSMS a continuación, ejecutar el siguiente.

En realidad no realiza el cambio, pero genera un script para que lo revise y lo ejecute.

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'user_name', 
     @login_name = 'login_name' 

SELECT ' 
    USE ' + QUOTENAME(NAME) + '; 

    CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 

    EXEC sys.sp_addrolemember 
     ''db_datareader'', 
     ''' + QUOTENAME(@user_name) + '''; 

    EXEC sys.sp_addrolemember 
     ''db_denydatawriter'', 
     ''' 
     + QUOTENAME(@user_name) + '''; 

GO 
' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

O usted podría mirar a sys.sp_MSforeachdbas here o versión mejorada de Aaron Bertrand here

Si usted no está viendo todos los personajes cuando se ejecuta ello, abra las Opciones de consulta para el texto y comprobar el ajuste de ' Número máximo de caracteres mostrados en cada columna '. Asegúrese de que esté configurado en un valor lo suficientemente grande como para mostrar todos los caracteres.

+2

¿Por qué estoy escuchando sobre este sp_msforeachdb ahora? Supongo que solo trato de descubrir todo con las herramientas que conozco. Bueno, lo estoy agregando a la caja de herramientas. ¡Gracias! – buckbova

+0

Gracias! Esto pareció funcionar. Tuve la copia de los resultados de esa consulta en el teclado y reemplacé Go with \ nGo \ n – Greg

+1

@Greg. Me alegro de que funcionó. ¿Lo ejecutó en Management Studio?Si es así, al seleccionar la opción "Resultados a texto" (CTRL + T) probablemente se habría evitado la necesidad del paso intermedio. –

5

Cursor a través de las bases de datos y el acceso GRANT a cada uno con un pequeño t-sql.

No he probado el código a continuación.

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 


WHILE @@FETCH_STATUS = 0 
BEGIN 

GRANT SELECT ON DATABASE::@name to 'username'; 

FETCH NEXT FROM db_cursor INTO @name 
END 
+0

El t-sql para usar después de ese punto es mi punto t de confusión. ¿Alguna sugerencia sobre eso? – Greg

2
Declare @Databases Cursor 
Declare @DbName as nvarchar(64) 
Declare @Sql nvarchar(max) 
Declare @BaseAddUserSql nvarchar(max) 
Declare @BaseAddRoleSql nvarchar(max) 

Set @Databases = Cursor Fast_Forward For 
    select [name] 
    from master..sysdatabases 
    where [name] not in('master','model','msdb','tempdb') 

Open @Databases 
Fetch Next From @Databases Into @DbName 

Set @BaseAddUserSql = 'exec sp_adduser ''LOGINNAME''' 
Set @BaseAddRoleSql = 'exec sp_addrolemember ''db_datareader'', ''LOGINNAME''' 


While @@Fetch_Status = 0 
Begin 
    Begin Try 
     Set @Sql = 'Use ' + Quotename(@DbName) 
     exec (@Sql) 

     Set @Sql = Replace(@BaseAddUserSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 

     Set @Sql = Replace(@BaseAddRoleSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 
    End Try 
    Begin Catch 
    End Catch 

    Fetch Next From @Databases Into @DbName 
End 

Close @Databases 
Deallocate @Databases 
+0

Dice que se completó correctamente pero no veo ningún cambio. El área de asignaciones de usuarios no ha cambiado. Y el inicio de sesión que puse para no aparece como usuario en ninguna de las bases de datos. ¿Algunas ideas? – Greg

+0

@Greg: es posible que desee comentar los bloques Try-Catch para ver el error que se está produciendo. – Thomas

3
EXEC sp_MSForEachDB 
'Declare @name varchar(100) 
select @name = ''?'' 
PRINT @name 
IF db_id(@name) > 4 
BEGIN 
USE ? 
CREATE USER [user] FOR LOGIN [user]; 
EXEC sp_addrolemember ''db_datareader'', ''user'' 
END' 
2

que tuvieron que ajustar la respuesta de Martin Smith ligeramente a medida:

  1. Los espacios y saltos de línea dieron como resultado que no todo el texto que se genera correctamente
  2. El QUOTENAME en la declaración Exec puesto en corchetes que es incorrecto

Mi versión:

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'HelpdeskUser', 
     @login_name = 'Helpdesk' 

SELECT 'USE ' + QUOTENAME(NAME) + '; 
     CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 
    EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; 
    EXEC sys.sp_addrolemember ''db_denydatawriter'', ''' + @user_name + '''; 
GO' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

De lo contrario funciona perfectamente. Gracias

0

Sólo necesitaba un usuario que tenga acceso a toda la base de datos con un permiso de lector de datos, así que utilicé este código: deberá ejecutar el resultado de la consulta por cierto.

USE [master] 
GO CREATE LOGIN [DOMAIN\USER] FROM WINDOWS WITH DEFAULT_DATABASE=[master] GO 
select 'use ['+name+'] 
CREATE USER [DOMAIN\USER] FOR LOGIN [DOMAIN\USER] 
EXEC sp_addrolemember N''db_datareader'', N''DOMAIN\USER'' 
' 
from sys.databases 

si no desea aplicarlo en las bases de datos del sistema sólo tiene que añadir donde database_id> 6

0

Se puede utilizar por ejemplo cursor, así:

USE master 
GO 

DECLARE @DatabaseName VARCHAR(32) 
DECLARE @SQL NVARCHAR(max) 
DECLARE @User VARCHAR(64) 
SET @User = '[SQL\srvSSISAcc]' --Your User 

DECLARE Grant_Permission CURSOR LOCAL FOR 
SELECT name FROM MASTER.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 

OPEN Grant_Permission 
FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @SQL = 'USE '+ '[' + @DatabaseName + ']' +'; '+ 'CREATE USER ' + @User + 
    'FOR LOGIN ' + @User + '; EXEC sp_addrolemember N''db_datareader'', 
    ' + @User + '; EXEC sp_addrolemember N''db_datawriter'', ' + @User + '' 

    EXEC sp_executesql @SQL 
    PRINT @SQL 

FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
END 
CLOSE Grant_Permission 
DEALLOCATE Grant_Permission 

Más información encontrar en mi post sobre este tema: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases

Cuestiones relacionadas