it-swarm.com.de

kann nicht als Datenbankprinzipal ausgeführt werden, da der Prinzipal nicht vorhanden ist - DB-Wiederherstellung

Ich habe eine Datenbanksicherung von einem meiner Clients erhalten und versuche nun, sie auf meinem System wiederherzustellen.

Ich habe versucht, dieses Problem bei Google zu suchen, und die meisten der vorgeschlagenen Lösungen ausprobiert, aber keine davon funktioniert. Kann jemand bitte eine spezifische Lösung für diesen Fehler nach der Wiederherstellung der Datenbank vorschlagen?

Screenshot des Fehlers Screenshot of error

Danke im Voraus!

5
iKishanSojitra

Wenn Sie eine Datenbank wiederherstellen, enthält sie Datenbankbenutzer. Diese Benutzer werden mit der Datenbank transportiert, wenn Sie eine Sicherung und Wiederherstellung auf einem anderen SQL Server durchführen.

Auf Ihren Quell- und Ziel-SQL-Servern befindet sich SQL Server-Anmeldungen. Diese Anmeldungen sind entweder SQL Server-Konten (native SQL Server-Anmeldungen) oder Windows Server-/Domänenkonten (Windows-Konten).

SQL Server-Anmeldungen

SQL Server-Anmeldungen (native SQL-Anmeldungen oder Windows-Konten) werden in der Master-Datenbank gespeichert und jeder SQL-Anmeldung wird eine eindeutige SID zugewiesen. Sie können eine Liste der SQL Server-Anmeldungen abrufen, wenn Sie die Systemkatalogansicht abfragen sys.server_principals .

select * from sys.server_principals

Sie erhalten eine Liste der SQL Server-Anmeldungen für Ihre SQL Server-Instanz.

Hinweis: Dies sind die SQL Server-Anmeldungen und nicht die Datenbankbenutzer.

Datenbankbenutzer

Datenbankbenutzer können abgefragt werden, indem die Systemkatalogansicht sys.database_principles Jeder Benutzerdatenbank abgefragt wird, indem die folgende Abfrage ausgegeben wird:

USE [<your_db>]
GO
SELECT * FROM sys.database_principals

Sie erhalten eine Liste der Datenbankbenutzer, denen Datenbankberechtigungen zugewiesen wurden.

Hinweis: Dies sind die Datenbankbenutzer und keine SQL Server-Anmeldungen.

Normales Verhalten

Wenn Sie eine Datenbank erstellen und der Datenbank mit bestimmten Berechtigungen einen "Benutzer" zuweisen, gehen Sie tatsächlich wie folgt vor (teilweise im Hintergrund):

  1. SQL Server-Login mit Passwort erstellen (sys.server_principal)
  2. Erstellen eines Datenbankbenutzers in der Datenbank (sys.database_principal)
  3. Erteilen von Berechtigungen an den Datenbankbenutzer (in verschiedenen Tabellen, abhängig von den Berechtigungen)

In diesem Fall stimmt die SID der SQL-Anmeldung (sys.server_principal) Mit der SID des Datenbankbenutzers (sys.database_principal) Überein.

Verhalten wiederherstellen

Wenn Sie eine Datenbank von einem SQL Server-Quellcode wiederherstellen, haben die Datenbankbenutzer (nur native SQL Server-Anmeldungen und lokale Windows-Konten) in der Quellendatenbank andere SIDs als die SQL Server-Anmeldungen = auf dem Zielserver. Dies liegt daran, dass die SID für die native SQL Server-Quellanmeldung und das lokale Windows-Zielkonto eindeutig ist.

Die SQL Server-Anmeldungen, die auf Windows-Domänenkonten basieren, haben immer dieselbe SID, da SQL Server diese Werte aus Active Directory abruft.

Wenn Sie die Datenbank von der Quelle auf dem Ziel-SQL Server wiederherstellen, stimmen die SIDs der nativen SQL Server-Anmeldungen nicht überein, obwohl ein Benutzer möglicherweise im Systemverwaltungskatalog sys.server_principals Der SQL Server-Instanz und in aufgeführt ist Der Systemverwaltungskatalog sys.database_principals der wiederhergestellten Datenbank.

Lösung

Um dies zu korrigieren und das Navigieren in den "SQL Server-Anmeldeberechtigungen" und/oder den "Datenbankeigenschaften | Berechtigungen" zu ermöglichen, können Sie diese verwaisten Datenbankbenutzer erneut mit der SQL Server-Anmeldung verknüpfen.

Wechseln Sie zu Ihrer Benutzerdatenbank und fragen Sie die verwaisten Datenbankbenutzer ab:

USE [your_db]
GO
sp_change_users_login 'Report'

Wenn ein Benutzer als verwaist gemeldet wird, können Sie die SQL Server-Anmeldung mit der Datenbankbenutzer verknüpfen, indem Sie den folgenden Befehl eingeben:

USE [your_db]
GO
sp_change_users_lgoin 'Update_one', '<database_user>', '<sql_server_login>'

Dadurch wird die (native) SQL Server-Anmeldung (sys.server_principal) Auf Ihrer Zielinstanz erneut mit dem Datenbankbenutzer (sys.database_principal) Der wiederhergestellten Datenbank verknüpft.

Alternative

Da sp_change_users_login Veraltet ist, können Sie dasselbe mit der Anweisung ALTER USER erreichen:

USE [<your_db>]
GO
ALTER USER <database_user> 
    WITH LOGIN = <sql_server_login>

In manchen Fällen

... wenn Sie eine Datenbanksicherung von einem Client erhalten, verfügen Sie möglicherweise nicht über eine entsprechende SQL Server-Anmeldung, um eine Verbindung zum Datenbankbenutzer herzustellen. In diesem Fall können Sie eine SQL Server-Anmeldung erstellen, ohne der wiederhergestellten Datenbank Berechtigungen zuzuweisen, und dann die neu erstellte SQL Server-Anmeldung mit dem Datenbankbenutzer mit den oben genannten Anweisungen verknüpfen.

8

Der Fehler, den Sie erhalten, stammt aus dem Code, den der SSMS-Dialog (in Ihrem Bild) startet.

Wenn Sie den Server über diesen Dialog nach den effektiven Berechtigungen eines Benutzers fragen, versucht der Server, sich als der ausgewählte Benutzer auszugeben, d. H. Wenn Sie auf test_user, effective permissions Klicken, lautet der Code, den er startet, folgender:

EXECUTE AS USER = N'test_user';
SELECT 
    permission_name AS [Permission]
FROM fn_my_permissions(N'[yourDB]', N'DATABASE')
ORDER BY permission_name;
REVERT;

Dies ist der Fall, wenn der Benutzer (test_user) ohne Login erstellt wird.

Wenn der Benutzer über eine entsprechende Anmeldung verfügt, versucht der Server, sich als die entsprechende Anmeldung auszugeben, da bei Anmeldung = Gewinngruppe möglicherweise mehr Benutzer vorhanden sind.

Es gibt andere Fälle, in denen der Benutzer beispielsweise aus certificate erstellt wird, aber ich kann jetzt nicht überwachen, welcher Code in diesem Fall ausgeführt wird.

m herauszufinden, welcher Code in Ihrem Fall vom Server ausgeführt wird, verwenden Sie einfach den SQL Server Profiler. Sie werden sehen, was er versucht, sich auszugeben, und die Ursache des Fehlers finden..

Ich weiß, wie ich diesen Fehler in einem bestimmten Fall einer Windows-Gruppe erhalten kann: Da er nicht verkörpert werden kann, wird genau dieser Fehler angezeigt.

Andere mögliche Ursachen: Möglicherweise fehlt Ihnen die Berechtigung, sich als dieser Benutzer auszugeben. Führen Sie den Code als sysadmin aus? Wenn nicht, kann dies Ihr Fall sein

UPDATE

Ich konnte es gerade reproduzieren. Verwaiste Benutzer, die mit Ihrer wiederhergestellten Datenbank auf einen anderen Server portiert wurden, erzeugen denselben Fehler, wenn Sie versuchen, sich als sie auszugeben..

Wenn für Ihren Orphan-Benutzer ein Login mit demselben Namen vorhanden ist (jedoch mit einer anderen ID), können Sie dies beheben, indem Sie den folgenden Code ausführen:

alter user test_user with login = test_user

Wenn Sie kein entsprechendes Login haben, können Sie es mit derselben Sid neu erstellen oder einfach ein neues Login erstellen und den vorhandenen Benutzer wie oben beschrieben aktualisieren.

Wenn Sie diesen Benutzer überhaupt nicht benötigen, lassen Sie ihn einfach fallen

0
sepupic