Sichern Sie SQL Server 2016-Instanzanmeldungen

8

Ich muss eine Instanz von SQL Server 2016 sichern. Ich habe bereits nächtliche Sicherungen der gewünschten Datenbanken, muss jedoch die Benutzer und Rollen für die Instanz sichern. Wie kann ich das tun? Eingebauter Job oder benutzerdefiniertes T-SQL, dessen Ausführung ich planen kann?

Ich bin nicht sehr gut mit SQL, wenn mich jemand in die richtige Richtung weisen kann

NULL.Dude
quelle
Ich kenne keine Möglichkeit, dies zu planen, aber haben Sie sich "Skripte generieren" angesehen und nur diese Objekte ausgewählt? Klicken Sie mit der rechten Maustaste auf DB> Aufgaben> Skripte erstellen und folgen Sie dem Assistenten.
Ollie
3
Ich habe Ihrem Titel das Wort "Anmeldungen" hinzugefügt, da es bei Ihrer Frage wirklich um das Sichern der SQL Server-Anmeldungen und nicht um die Datenbanksicherungen geht. Ich hoffe das ist ok mit dir? Ansonsten zögern Sie nicht, zurück zu redigieren.
John aka hot2use

Antworten:

9

Allgemein

Ich würde nachlesen, welche Informationen die Master-Datenbank enthält und warum Sie die Systemdatenbanken (master, msdb, ...) sichern müssen.

Referenz: Sichern und Wiederherstellen von Systemdatenbanken (SQL Server) (Microsoft Docs)

Master-Datenbank

Die Master-Datenbank enthält die folgenden Informationen für jede SQL Server-Instanz:

Die Master-Datenbank zeichnet alle Informationen auf Systemebene für ein SQL Server-System auf. Dies umfasst instanzweite Metadaten wie Anmeldekonten , Endpunkte, Verbindungsserver und Systemkonfigurationseinstellungen. In SQL Server werden Systemobjekte nicht mehr in der Masterdatenbank gespeichert. Stattdessen werden sie in der Ressourcendatenbank gespeichert. Master ist auch die Datenbank, die das Vorhandensein aller anderen Datenbanken und den Speicherort dieser Datenbankdateien aufzeichnet und die Initialisierungsinformationen für SQL Server aufzeichnet. Daher kann SQL Server nicht gestartet werden, wenn die Masterdatenbank nicht verfügbar ist.

( Hervorhebung von mir)

Referenz: Master-Datenbank (Microsoft Docs)

msdb Datenbank

Die msdb-Datenbank enthält die folgenden Informationen einer SQL Server-Instanz:

Die msdb-Datenbank wird vom SQL Server-Agenten zum Planen von Warnungen und Jobs sowie von anderen Funktionen wie SQL Server Management Studio, Service Broker und Database Mail verwendet.

Beispielsweise verwaltet SQL Server automatisch einen vollständigen Online-Sicherungs- und Wiederherstellungsverlauf in Tabellen in msdb . Diese Informationen umfassen den Namen der Partei, die die Sicherung durchgeführt hat, den Zeitpunkt der Sicherung und die Geräte oder Dateien, auf denen die Sicherung gespeichert ist. SQL Server Management Studio verwendet diese Informationen, um einen Plan zum Wiederherstellen einer Datenbank und zum Anwenden von Transaktionsprotokollsicherungen vorzuschlagen. Sicherungsereignisse für alle Datenbanken werden aufgezeichnet, auch wenn sie mit benutzerdefinierten Anwendungen oder Tools von Drittanbietern erstellt wurden.Wenn Sie beispielsweise eine Microsoft Visual Basic-Anwendung verwenden, die SMO-Objekte (SQL Server Management Objects) aufruft, um Sicherungsvorgänge auszuführen, wird das Ereignis in den msdb-Systemtabellen, im Microsoft Windows-Anwendungsprotokoll und im SQL Server-Fehlerprotokoll protokolliert. Um die in msdb gespeicherten Informationen zu schützen, empfehlen wir Ihnen, das msdb-Transaktionsprotokoll in einem fehlertoleranten Speicher abzulegen.

( Hervorhebung von mir)

Referenz: msdb-Datenbank (Microsoft Docs)

Fazit

Wenn Sie die Master-Datenbank sichern, sind alle Anmeldeinformationen für die Instanz sicher. Wenn Sie jedoch die SQL-Anmeldungen der Instanz separat sichern möchten ( wie in: Zum Übertragen von Anmeldungen an verschiedene Instanzen, zum Zurücksetzen von Kennwörtern), müssen Sie eine andere Lösung anwenden.

Individuelle SQL Server Login Backup-Lösungen

Werkzeugreferenzliste

Bonus hinzugefügt

Die letzte Referenz ist ein interessanter Artikel zum manuellen Exportieren der SQL Server-Anmeldungen und der Hash-Kennwörter, um sie manuell auf eine neue SQL Server-Instanz zu übertragen. In diesem Artikel werden zwei gespeicherte Prozeduren erstellt und anschließend eine ausgeführt, um die Informationen zu erstellen.

Hier ist der Code aus dem Artikel, auf den verwiesen wird, um die beiden Prozeduren zu erstellen:

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
  DECLARE @tempint int
  DECLARE @firstint int
  DECLARE @secondint int
  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  SELECT @firstint = FLOOR(@tempint/16)
  SELECT @secondint = @tempint - (@firstint*16)
  SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
  SELECT @i = @i + 1
END

SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary  varbinary (256)
DECLARE @PWD_string  varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr  varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)

DECLARE @defaultdb sysname

IF (@login_name IS NULL)
  DECLARE login_curs CURSOR FOR

      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
  DECLARE login_curs CURSOR FOR


      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT 'No login(s) found.'
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
  IF (@@fetch_status <> -2)
  BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@type IN ( 'G', 'U'))
    BEGIN -- NT authenticated account/group

      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
    END
    ELSE BEGIN -- SQL Server authentication
        -- obtain password and sid
            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

        -- obtain password policy state
        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

            SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'

        IF ( @is_policy_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
        END
        IF ( @is_expiration_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
        END
    END
    IF (@denylogin = 1)
    BEGIN -- login is denied access
      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
    END
    ELSE IF (@hasaccess = 0)
    BEGIN -- login exists but does not have access
      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
    END
    IF (@is_disabled = 1)
    BEGIN -- login is disabled
      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
    END
    PRINT @tmpstr
  END

  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
   END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

Nachdem Sie die gespeicherten Prozeduren erstellt haben, führen Sie sp_help_rev_login aus, um die Informationen abzurufen.

EXEC sp_help_revlogin

Das Ausgabeskript, das die gespeicherte Prozedur sp_help_revlogin generiert, ist das Anmeldeskript. Dieses Anmeldeskript erstellt die Anmeldungen mit der ursprünglichen Sicherheitskennung (SID) und dem ursprünglichen Kennwort.

Referenz: So übertragen Sie Anmeldungen und Kennwörter zwischen Instanzen von SQL Server (Microsoft KB-Artikel)

Genießen

John aka hot2use
quelle
Fantastisch! alles was ich brauchte und mehr! danke :)
NULL.Dude
3

Sie sollten sehen, ob DBATools eine Lösung für Sie ist.

dbatools ist ein kostenloses PowerShell-Modul mit über 300 SQL Server-Verwaltungs-, Best Practice- und Migrationsbefehlen.

Holen Sie sich Mitglieder aller Rollen in einer SQL-Instanz. Die Standardausgabe enthält die Spalten SqlServer, Database, Role, Member.

Export-DBAUser-Befehl über DBATools

DBATools herunterladen

Shaulinator
quelle
2

Beide Antworten sind gut.

Ich möchte nur eine weitere Option von unserem eigenen @ Kenneth-Fisher hinzufügen :

Beispielcode:

EXEC master.dbo.sp_SrvPermissions 
    @Principal = 'NULL',
    @Role = NULL, 
    @Type = NULL,
    @DBName = NULL,
    @UseLikeSearch = 1,
    @IncludeMSShipped = 0,
    @DropTempTables = 1,
    @Output = 'Default',
    @Print = 0

EXEC master.dbo.sp_DBPermissions
    @DBName = 'ALL',
    @Principal = 'NULL',
    @IncludeMSShipped = 0,
    @Role = NULL,
    @Type = NULL,
    @ObjectName = NULL,
    @Permission = NULL,
    @LoginName = NULL,
    @Print = 0;
Marian
quelle