Fix für verwaisten Benutzer 'Gast'?

8

Was kann getan werden, wenn der spezielle guestBenutzer verwaist ist (nicht mit einem Login verknüpft)?

Für eine meiner Datenbanken (SQL Server 2005), die folgenden Listen der Ausführung Gast Benutzer als verwaiste Benutzer.

exec sp_change_users_login 'report'

Ergebnisse:

UserName    UserSID
guest       0x3C2E66759FFBC14F84127D6795C27FD3

Wenn ich versuche , das zu beheben Gast Benutzer unter Verwendung dieses Verfahrens, erhalte ich die folgende:

exec sp_change_users_login 'update_one', 'guest', 'guest'

Beenden dieses Vorgangs. 'guest' ist ein verbotener Wert für den Parameter login name in diesem Verfahren.

Wenn ich versuche, den Benutzer zu löschen, erhalte ich:

Der Benutzer 'Gast' kann nicht gelöscht, sondern nur deaktiviert werden.

select * from sys.database_principals where name = 'guest'

Ergebnisse in:

name                 guest
principal_id         2
type                 S
type_desc            SQL_USER
default_schema_name  guest
create_date          11/13/98 2:58 AM
modify_date          10/16/01 4:31 PM
owning_principal_id  NULL
sid                  0x3C2E66759FFBC14F84127D6795C27FD3
is_fixed_role        0

Die Datenbank scheint verwirrt zu sein, ob dies ein spezieller Benutzer ist oder nicht. Gibt es etwas, das getan werden kann?

JustinStolle
quelle
Seine SID wird als 0x3C2E66759FFBC14F84127D6795C27FD3anstelle von0x00
JustinStolle
Haben Sie schon versucht, die automatische Korrektur durchzuführen? Ich bin gespannt auf das Ergebnis.
SQLRockstar
Ich bekommeTerminating this procedure. 'guest' is a forbidden value for the login name parameter in this procedure.
JustinStolle
Sie erhalten diesen Fehler, weil Sie keinen Gast als Benutzernamen haben können ( msdn.microsoft.com/en-us/library/ms174378.aspx ). Es fällt mir schwer, Ihr Szenario neu zu erstellen.
Thomas Stringer
1
Ich möchte hinzufügen, dass ich genau das gleiche Problem hatte wie Justin. Das Problem hierbei ist, dass die Seite des Gastes 0x00 sein sollte, aber aus irgendeinem Grund ist dies nicht der Fall, und als solches wird sp_change_users_login 'report' es als verwaisten Benutzer aufnehmen. Ich kann einfach nicht erkennen, dass es für DBAs eine Möglichkeit gibt, die Seite des Gastes auf normale Weise zu ändern oder durcheinander zu bringen. Ich würde also denken, dass dieses Durcheinander möglicherweise irgendwann durch SQL Server-Patches verursacht wird.
Jyao

Antworten:

5

Der Benutzer "Gast" wird niemals einem Server-Login zugewiesen, selbst bei einer Neuinstallation wird er als SQL-Benutzer ohne Login klassifiziert. Da Sie nur die SID eines Logins (bei der Erstellung) und nicht eines Benutzers festlegen können, glaube ich nicht, dass dies möglich ist. sp_change_users_login funktioniert nicht genau aus dem Grund, dass das Gastkonto niemals einem Server-Login zugeordnet werden sollte. Infolgedessen ist der Benutzer "Gast" immer ein verwaister Benutzer. Wahrscheinlich nicht die Antwort, die Sie wollten :)

Herr Brownstone
quelle
Denken Sie, dass es eine Möglichkeit gibt, diese Datenbank an einem anderen Speicherort zu sichern / wiederherzustellen, während der Gastbenutzer von der Wiederherstellung ausgeschlossen wird?
JustinStolle
Ja, aber es ist nicht schön. Eine einfache Sicherung und Wiederherstellung würde nicht funktionieren, da der Gastbenutzer darin enthalten wäre. Sie müssten mit einer neuen Datenbank beginnen, die mit derselben Methode erstellt wurde, mit der Sie sie ursprünglich installiert haben (vorausgesetzt, der Gast im Modell hat die richtige SID). Exportieren Sie dann von Ihrem vorhandenen System alle Daten in Ihre neue Datenbank. Dies würde funktionieren, aber es ist eine Menge Aufwand für etwas so
Geringes
Obwohl das Konto eine unerwartete SID hat, denken Sie, dass es kein wirkliches Problem gibt und es sicher ist, es im sp_change_users_loginBericht zu ignorieren ?
JustinStolle
In diesem Fall würde ich das sagen, basierend auf der Tatsache, dass man sowieso nicht wirklich so viel dagegen tun kann. Dann gibt es die klassische Debatte darüber, ob Sie es sowieso verwenden sollten / nicht, aber das ist eine ganz andere Frage ... :)
Mr.Brownstone
2

Meine Gedanken ... Der Grund sp_change_users_loginfür diesen Fehler ist, dass MS ihn auch geschrieben hat. [Hin und wieder das Durchsuchen des Systemprozedurcodes kann Spaß machen. :)] Die Tatsache, dass es beim Ausführen des Berichts angezeigt wird, zeigt jedoch an, dass jemand / ein Prozess mit dem Konto in Konflikt geraten ist oder dass ein möglicher Hotfix von MS dies hätte tun können (Sie wissen es nie).

Das Gastkonto soll vorhanden sein. Es ist in jeder Datenbank vorhanden, die erstellt wird, da das Konto standardmäßig im Modell vorhanden ist. Wenn es nicht im Bericht angezeigt wird, muss die SID wahrscheinlich wieder auf " 0x00Ich denke" geändert werden . Solange das Konto deaktiviert ist, würde ich es in Ruhe lassen und ignorieren. Wenn es mich wirklich störte, würde ich das Geld herausgeben und einen Anruf beim Microsoft-Support tätigen.


quelle
Mit anderen Worten, Sie sagen, dass es guestin diesem Fall kein Problem ist, das in den Ergebnissen auftaucht.
JustinStolle
Ziemlich genau, ja.
1

Hinweis: Wenn Sie Ihre Datenbank von einem Server auf einen anderen Server verschieben, tritt normalerweise ein Problem mit verwaisten Benutzern auf. FileListOnly ist der neue Begriff in SQL Server, der alle Details der erstellten Sicherung enthält, die Zugriff darauf hat.

Es gibt also eine Abfolge von Aufgaben, denen Sie folgen müssen

  1. Zunächst müssen Sie FileListOnly von der erstellten Sicherung auf dem Ziel oder dem neuen Server wiederherstellen.
  2. Stellen Sie die Sicherung wieder her.
  3. Verwenden Sie das sp_change_users_login nach Bedarf. Hilfe zu diesem Verfahren finden Sie unter http://msdn.microsoft.com/en-us/library/ms174378.aspx .

Ich habe hier ein Beispiel gegeben, hoffe es wird helfen:

> RESTORE FILELISTONLY FROM DISK = N'C:\YourDB.bak'
> 
> RESTORE DATABASE YourDb FROM DISK = N'C:\YourDB.bak' WITH MOVE
> N'YourDB' TO N'D:\YourDB.mdf', MOVE N'YourDB_log' TO N'D:\YourDB.ldf',
> REPLACE
> 
> exec YourDB.dbo.sp_change_users_login 'update_one', 'UserName','UserName'
JP Chauhan
quelle
Dies funktioniert für den guestBenutzer nicht. Siehe Antwort oben von Mr. Brownstone.
Simon Righarts