it-swarm.com.de

SQL Server - So gewähren Sie einem Login Lesezugriff auf ALLE Datenbanken?

Ich muss einen neuen Login-Lesezugriff auf alle 300 Datenbanken auf einem Server gewähren. Wie kann ich dies erreichen, ohne 300 Kontrollkästchen im Benutzerzuordnungsbereich zu aktivieren?

18
Greg

Eine Möglichkeit wäre, im Abfrage-Menü in SSMS "Ergebnisse in Text" zu setzen und anschließend die folgenden auszuführen.

Es nimmt nicht wirklich die Änderung vor, sondern generiert ein Skript, das Sie überprüfen und ausführen können.

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' 

Oder Sie können sich sys.sp_MSforeachdbwie hier oder die verbesserte Version von Aaron Bertrand hier anschauen.

Wenn Sie bei der Ausführung nicht alle Zeichen sehen, öffnen Sie die Abfrageoptionen für Text und überprüfen Sie die Einstellung für "Maximale Anzahl der in jeder Spalte angezeigten Zeichen". Stellen Sie sicher, dass hier ein Wert eingestellt ist, der groß genug ist, um alle Zeichen anzuzeigen.

19
Martin Smith

Cursor durch die Datenbanken und GRANT Zugriff auf jede mit ein wenig t-sql.

Ich habe den folgenden Code nicht getestet.

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 
5
buckbova
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'
4
Steven Van Epps
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
2
Thomas

Ich musste die Antwort von Martin Smith etwas verbessern:

  1. Die Leerzeichen und Zeilenumbrüche führten dazu, dass nicht der gesamte Text ordnungsgemäß generiert wurde
  2. Der QUOTENAME in der Exec-Anweisung wird in eckige Klammern gesetzt, was falsch ist.

Meine Version:

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' 

Ansonsten funktioniert das einwandfrei. Vielen Dank

2

Ich brauchte nur einen Benutzer, der Zugriff auf alle Datenbanken mit einer Datenleser-Berechtigung haben kann. Deshalb habe ich diesen Code verwendet: Sie müssen das Ergebnis aus der Abfrage BTW ausführen.

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

wenn Sie es nicht auf Systemdatenbanken anwenden möchten, fügen Sie einfach hinzu, wobei Datenbank-ID> 6

0
DnL

Sie können beispielsweise Cursor wie folgt verwenden:

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 

Weitere Informationen finden Sie in meinem Beitrag zu diesem Thema: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases

0
Filip Holub