Necesito dar un nuevo acceso de lectura de inicio de sesión a las 300 bases de datos en un servidor. ¿Cómo puedo lograr esto sin consultar 300 casillas de verificación en el área de mapeo del usuario?SQL Server - ¿Cómo otorgar acceso de lectura a TODAS las bases de datos a un inicio de sesión?
Respuesta
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_MSforeachdb
as 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.
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
El t-sql para usar después de ese punto es mi punto t de confusión. ¿Alguna sugerencia sobre eso? – Greg
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
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
@Greg: es posible que desee comentar los bloques Try-Catch para ver el error que se está produciendo. – Thomas
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'
que tuvieron que ajustar la respuesta de Martin Smith ligeramente a medida:
- Los espacios y saltos de línea dieron como resultado que no todo el texto que se genera correctamente
- 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
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
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
- 1. Cómo otorgar a los usuarios acceso de solo lectura a todas las bases de datos
- 2. Restringir el acceso de inicio de sesión de SQL Server a una sola base de datos
- 3. SQL Server dando inicio de sesión (usuarios) acceso de db_owner a la base de datos
- 4. ¿Cómo otorgo acceso de lectura para un usuario a una base de datos en SQL Server?
- 5. Servidor SQL: otorgue un permiso de inicio de sesión para acceso de lectura a todas las bases de datos existentes y futuras
- 6. ¿Cómo controlar las bases de datos de SQL Server?
- 7. SQL asignar un inicio de sesión a un usuario existente
- 8. ¿Qué es el T-SQL para otorgar acceso de lectura y escritura a las tablas en una base de datos en SQL Server?
- 9. Exportar todas las tablas de SQL Server a archivos separados
- 10. Cómo conectar un inicio de sesión existente de SQL Server a un usuario existente de la base de datos SQL Server del mismo nombre
- 11. ¿Cómo puedo otorgar a datareader un rol sql?
- 12. Un usuario por base de datos contra usuario único para todas las bases de datos
- 13. Soltar todas las bases de datos del servidor
- 14. Buscar todas las referencias a un objeto en una base de datos SQL Server
- 15. Vista de SQL Server en varias bases de datos
- 16. MySQL conceder privilegios a todas las bases de datos, excepto una mesa de
- 17. ¿Están las bases de datos orientadas a documentos destinadas a reemplazar las bases de datos relacionales?
- 18. MongoDB soltar todas las bases de datos
- 19. Cambiar inicio de sesión predeterminado SQL Server Management Studio (SSMS)
- 20. Acceso a bases de datos síncronas vs. asíncronas
- 21. Error en el inicio de sesión de SQL Server
- 22. SQL Server Reporting Services Datasource sigue perdiendo credenciales de inicio de sesión de base de datos
- 23. Cómo mostrar todas las tablas de múltiples bases de datos
- 24. ¿Cómo liberar la memoria utilizada por las bases de datos inactivas de SQL Server?
- 25. Dejar y recrear bases de datos en Microsoft SQL Server
- 26. Acceso a mensajes de SQL Server a través de ADO.NET
- 27. ¿Cómo combinar dos bases de datos en SQL Server?
- 28. Cómo descartar varias bases de datos en SQL Server
- 29. SQL Server no está configurado para el acceso a datos
- 30. C++ Acceso a SQL Server desde Linux
¿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
Gracias! Esto pareció funcionar. Tuve la copia de los resultados de esa consulta en el teclado y reemplacé Go with \ nGo \ n – Greg
@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. –