Benutzerberechtigungen nach einer Sicherung -> Wiederherstellungsoperation durcheinander gebracht


11

Ich musste mehrere SQL Server 2008-Datenbanken auf unseren neuen Datenbankserver verschieben, um sie alle zu sichern (in .bak-Dateien), diese Dateien in die neue Box zu kopieren und wiederherzustellen (alles mit SQL Management Studio).

Alles ging in Ordnung, aber jetzt kann ich mich mit dem SQL Server-Konto, das weiterhin auf dem alten RDBMS funktioniert, bei keiner der Datenbanken anmelden. Mein Windows-authentifizierter Login funktioniert übrigens immer noch einwandfrei.

Ich hatte die Idee, dass die Benutzer und Berechtigungen nahtlos auf den neuen Datenbankserver dupliziert werden, aber es scheint, dass irgendwo etwas schief gelaufen ist. Ich würde mich über Kommentare / Vorschläge / Hilfsangebote freuen ;-)

Antworten:


7

Ich sehe, dass Sie bereits eine Lösung für Ihr Problem gefunden haben. Eine Sache, die mir in Ihrer ursprünglichen Frage aufgefallen ist, war, dass Sie immer noch Zugriff auf den alten Server hatten.

Die folgende Frage zu SO hatte ein ähnliches Problem und enthält Links zu einem Microsoft-Artikel mit einem Skript zum Generieren der Benutzerberechtigungen.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Für diese Frage aufgeführte Ressource http://support.microsoft.com/kb/918992 )

Es klingt so, als ob das Ändern der Servereinstellung von Windows-Authentifizierung auf Authentifizierung im gemischten Modus Ihr Problem behoben hat, aber nur für den Fall, dass das Problem dadurch nicht vollständig behoben wurde, hielt ich dies für nützlich.


Ich bin mir sicher, dass dies nicht das erste Mal ist, dass ich mich mit SQL Server über Benutzer / Berechtigungen auseinandersetze, also werde ich den Artikel für die Nachwelt mit einem Lesezeichen versehen. Vielen Dank für die Veröffentlichung.
5arx

6

Dies wird als "verwaiste Benutzer" bezeichnet. Hier sind 2 Möglichkeiten, dies zu beheben

  1. Wenn Sie können, stellen Sie die ursprüngliche Masterdatenbank als "Anmeldequelle" wieder her, und sys.server_principals verfügt über genügend Informationen, um alle SQL Server- und Windows-Anmeldungen zu generieren. Das heißt, die SIDs und das verschlüsselte Passwort

  2. Wenn Sie nur Windows-Anmeldungen verwenden, können Sie diese pro Datenbank ausführen, um ein Skript zu generieren

Skript:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

Vielen Dank für Ihre Antwort. Meine Web-App verwendet SQL-Anmeldungen, während unsere Windows-Konten für Verwaltungszwecke verwendet werden. Ich kann keinen Weg finden, um als "Loginsource" wiederherzustellen, wie Sie vorschlagen - könnten Sie bitte näher darauf eingehen? Ich hoffe, dass dies alles mit Managment Studio möglich ist.
5arx

PS. Ich folgte diesem Dokument: support.microsoft.com/kb/274188 und führte alle Skripte (anscheinend) erfolgreich aus. Aber nichts hat sich geändert.
5arx

5

Idealerweise würden Sie die Benutzer und Berechtigungen vor der Wiederherstellung ausschreiben. Wenn dies nicht geschehen ist, müssen Sie die Dinge nachträglich reparieren, und es besteht die Möglichkeit, dass etwas übersehen wird, aber Sie sollten in der Lage sein, etwa 90% des Weges dorthin zu schaffen.

Als erstes müssen Sie feststellen, ob auf dem neuen Server dieselben Anmeldungen vorhanden sind. Wenn dies nicht der Fall ist, sollten Sie herausfinden, ob die Anmeldungen auf dem neuen Server erstellt werden können. Gehen Sie niemals davon aus, dass sie erstellt werden sollten, es könnte einen guten Grund dafür geben, warum sie überhaupt nicht existierten. Sie können sie dann erstellen, indem Sie die Sysuser-Tabelle durchsuchen.

Sie können die verwaisten Benutzer reparieren, indem Sie Folgendes ausführen:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Dieser Code funktioniert für SQL2008, wurde jedoch so geschrieben, dass er für SQL2000 abwärtskompatibel ist.


Danke für das Skript. Kann ich davon ausgehen, dass dies in Management Studio nicht möglich ist? Einige Leute schlagen außerdem vor, die Benutzer auf DB-Ebene zu löschen und neu zu erstellen. Wird dies empfohlen?
5arx

Dies setzt voraus, dass bereits Anmeldungen vorhanden sind und nur SIDs
mataches

aktualisiert sp_change_users_login die SID nicht? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar

5arx - In SSMS gibt es keine Möglichkeit, dies zu tun. Wie gesagt, in einer idealen Situation hätten Sie Ihre Berechtigungen vor der Wiederherstellung per Skript erstellt. Zu diesem Zeitpunkt müssen Sie entweder von Hand neu erstellen oder versuchen, die Dinge manuell selbst zusammenzusetzen. Wenn ich Sie wäre, würde ich die alte Datenbank wiederherstellen, die Berechtigungen skripten, die Wiederherstellung vom anderen Server durchführen und dann Ihre Berechtigungen wiederholen.
SQLRockstar

"Update_One: Verknüpft den angegebenen Benutzer in der aktuellen Datenbank mit einer vorhandenen SQL Server-Anmeldung. Benutzer und Anmeldung müssen angegeben werden. Das Kennwort muss NULL oder nicht angegeben sein." Es wird also davon ausgegangen, dass bereits Anmeldungen vorhanden sind.
Gbn


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.