it-swarm.com.de

Beim Anfügen einer Datenbank wird der Zugriff verweigert

Ich verwende die SQL Server 2008 Developer Edition. Ich habe versucht, die AdventureWorks2008-Datenbank anzuschließen. 

Beim Versuch, eine Verbindung herzustellen, wurde die Fehlermeldung "Zugriff verweigert" angezeigt. Laut dem Ereignisprotokoll kam es vom O/S: 

Öffnen fehlgeschlagen: Datei D:\ProjectData\AdventureWorks\AdventureWorksLT2008_Data.mdf für Dateinummer 0 konnte nicht geöffnet werden. Betriebssystemfehler: 5 (Zugriff wird verweigert.).

Ich dachte "NTFS-Problem", aber System (und ich) haben Änderungszugriff auf beide Dateien.

Ich habe festgestellt, dass ich die Datenbank erfolgreich anfügen kann, wenn ich mich als sa anmelde, aber mein Benutzerkonto funktioniert nicht.

Ich bin Mitglied der lokalen Administratorengruppe auf meinem Computer und in der Rolle "Sysadmins" in der SQL Server-Instanz.

Irgendeine Idee, warum ich als SA angemeldet sein musste?

134
JMarsch

Vielen Dank für alle Kommentare. Einige von Ihnen haben geholfen, mich zur Antwort zu führen. Folgendes habe ich gefunden:

Es war ein NTFS-Berechtigungsproblem und kein SQL-Problem. Außerdem sieht es irgendwie fehlerhaft aus (und es ist wiederholbar).

Das Problem: Das Konto, das ich verwendete, hatte volle NTFS-Berechtigungen für die MDF- und die LDF-Datei. Es hatte jedoch diese Berechtigungen über die Gruppenmitgliedschaft (die Gruppe der lokalen Administratoren verfügte über Berechtigungen und mein Konto ist Mitglied der lokalen Administratoren). (Ich habe die Berechtigungen überprüft)

Wenn ich versuche, die Verbindung herzustellen, stelle ich eine Verbindung zu SQL Server als mir her (wo ich mich in der Gruppe der Admins befinde), schlägt das NTFS-Problem fehl.

Wenn ich jedoch die gleichen Dateiberechtigungen erteile, die die lokale Administratorengruppe direkt für mein Domänenkonto besitzt, kann ich ohne Probleme eine Verbindung herstellen.

(Oh, und ja, ich habe die lokalen Gruppen auf diesem Computer überprüft und festgestellt, dass mein Domänenkonto tatsächlich Mitglied der lokalen Administratorengruppe ist).

Es sieht also so aus, als ob der Fehler auftritt, weil Code (entweder in SQL Server oder Management Studio) nach den Berechtigungen sucht, die das Benutzerkonto besitzt, jedoch nicht so weit, Gruppenberechtigungen zu überprüfen, die das Benutzerkonto erbt.

Das klingt komisch für mich, aber ich kann es immer wieder reproduzieren, daher bin ich zu dem Schluss gekommen, dass es die Antwort ist.

Update: Ich habe dies als Fehler gemeldet: https://connect.Microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

95
JMarsch

Führen Sie SQL Server Management Studio als Administrator aus. (Rechtsklick -> Als Administrator ausführen) hat sich in meinem Fall um die ganze Verrücktheit gekümmert. 

SQL SRV EXPRESS 2008 R2. Windows 7

143
MandoMando

Ich möchte zusätzliche Informationen zu den Antworten hinzufügen, die gepostet wurden. 

Seien Sie vorsichtig, wenn Sie die Datenbank trennen , weil der windows-Benutzer, an dem Sie angemeldet sind, der einzige Benutzer wird, der Berechtigungen für die .mdf-Datei hat! Die ursprünglichen Berechtigungen der .mdf-Datei, die den Benutzer SQLServerMSSQLUser$<computer_name>$<instance_name> und das Administratorkonto enthielten, werden von dem Windows-Benutzer überschrieben, bei dem Sie angemeldet sind (nicht der SQL-Server-Benutzer). Boom, alle Berechtigungen sind einfach so gegangen. Machen Sie es wie andere gesagt und klicken Sie mit der rechten Maustaste auf Ihre .mdf-Datei, und überprüfen Sie die Berechtigungen.

Ich bin auf dieses Problem gestoßen, weil ich SSMS verwendet habe, um eine Verbindung zur Datenbank herzustellen (egal welches SQL Server-Konto) und die Datenbank getrennt hat. Danach war mein Windows-Benutzer der einzige, der über Berechtigungen für die MDF-Datei verfügte. Als ich später versuchte, die Datenbank mit dem sa-Konto anzuhängen, wurde der Fehler "Zugriff verweigert" geworfen. 

Um die ursprünglichen Berechtigungen auf dem neuesten Stand zu halten, sollten Sie die Datenbank offline schalten, trennen und dann in der folgenden Reihenfolge anhängen:

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO
17
goku_da_master

Fügen Sie die Berechtigung für den Ordner hinzu, in dem sich Ihre .mdf-Datei befindet.

Überprüfen Sie diesen Namen: NT Service\MSSQLSERVER

Ändern Sie die Location in Ihren Servernamen.

15
Leonardo

Dieses Problem wird durch die Benutzerkontensteuerung verursacht, nicht wahr? Obwohl Ihr Benutzerkonto Mitglied der Administratorengruppe ist, können Sie mit der Benutzerkontensteuerung in Windows 7 keine Administratoraufgaben ausführen, es sei denn, Sie führen Programme "als Administrator" aus. Es ist kein echter Fehler in SQL Server oder Management Studio oder was auch immer. (Obwohl es möglicherweise das Problem kennen könnte und Sie nach erhöhten Berechtigungen fragt, anstatt nur "Fehler 5" zu beanstanden).

13
Al Kepp

Führen Sie SQL Server Management Studio als Administrator aus. (Rechtsklick -> Als Administrator ausführen) arbeitete für mich mit Windows 7 - SQL Server 2008 R2

11
Rolwin C

Eine SQL2005-Datenbank kann auf folgende Weise in Windows 7 angefügt werden:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

Und dann angehängte Datenbank erfolgreich abgeschlossen. 

9

Wenn Sie sich als sa (oder ein beliebiges SQL Server-Konto) anmelden, fungieren Sie als SQL Server-Dienstkonto. Wenn Sie als Sie angemeldet sind, haben Sie die Berechtigungen Ihres Kontos. Aus irgendeinem Grund haben Sie nicht den richtigen Dateizugriff, das Dienstkonto jedoch.

8
Nick Craver

Mit mir - Wird in Fenster 8 ausgeführt - Klicken Sie auf SQL Server Manager Studio -> Run with admin. -> keine probleme anbringen

5
Grey Wolf

es kann einfach behoben werden aber radikal, gehen Sie einfach zu dem Ordner, in dem Sie mdf-Datei gespeichert haben . Datei auswählen -> Rechtsklick -> auf Eigenschaften klicken und vollständige Berechtigung für die Datei für den angemeldeten Benutzer Sicherheit erteilen.

5
Ema.H

Ich habe diese Lösung gefunden: Klicken Sie mit der rechten Maustaste auf den Ordner, in dem Sie Ihre .mdf-Datei gespeichert haben -> klicken Sie auf Eigenschaften -> wählen Sie die Registerkarte Sicherheit, klicken Sie auf Bearbeiten ... und geben Sie ihr die volle Kontrolle ...

4
quokka

Der Benutzer sa verwendet die NTFS-Konten SQLServerMSSQLUser$<computer_name>$<instance_name> und SQLServerSQLAgentUser$<computer_name>$<instance_name>, um auf die Datenbankdateien zuzugreifen. Sie können versuchen, Berechtigungen für einen oder beide dieser Benutzer hinzuzufügen. 

Ich weiß nicht, ob Ihr Problem gelöst wird, da Sie sagen, dass Sie keine Probleme mit dem Benutzer sa haben. Ich hoffe, es hilft.

4
djeidot

Jedes Mal, wenn ich auf dieses Problem gestoßen bin, war der Versuch, eine Datenbank anzuhängen, die sich in einem anderen Verzeichnis befindet als das Standard-Datenbankverzeichnis, das in SQL Server eingerichtet ist.

Ich würde dringend empfehlen, dass Sie anstelle des Zugriffs mit Berechtigungen für verschiedene Verzeichnisse und Konten einfach Ihre Datendatei in das Verzeichnis verschieben, das der SQL-Server erwartet, um sie zu finden.

3
NotMe

Ich wollte nur diese Informationen auch hinzufügen.

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

Lösung

Sie erhalten diesen Fehler, weil zwei verschiedene Anmeldungen die Trennungs- und Verbindungsoperationen ausgeführt haben. Wenn die Dateien getrennt wurden, gehörten sie der ersten Anmeldung, aber die Verbindung schlug fehl, da die verwendete Anmeldung nicht der Eigentümer der MDF- und der LDF-Datei war.

Wenn wir Datenbankdateien trennen, wird der Eigentümer zu der Person, die den Befehl zum Lösen ausgeführt hat. Um das Problem zu lösen, müssen Sie den anderen Benutzernamen ändern oder den Eigentümer als Besitzer der MDF- und der Ldf-Datei hinzufügen.

Klicken Sie mit der rechten Maustaste auf die Datei "Dateiname.mdf" und wählen Sie Eigenschaften aus, um die Berechtigungen der MDF-Datei zu überprüfen. Hier sehen wir, dass nur ein Konto die Berechtigung für die Datei "Dateiname.mdf" hat, da dies das Konto war, das zum Trennen der Datenbank verwendet wurde.

Um dieses Problem zu beheben, klicken Sie auf die Schaltfläche Hinzufügen ..., um das andere Login oder ein anderes erforderliches Login hinzuzufügen und dem Login Vollzugriff zu gewähren. Sie sollten dies auch für die "ldf" -Datei tun. Wenn Sie diese Aufgabe abgeschlossen haben, klicken Sie auf die Schaltfläche OK. (Hinweis für andere Betriebssystemversionen, für die Sie möglicherweise die Option "Bearbeiten" haben, klicken Sie zuerst auf diese Option. Anschließend wird die Option "Hinzufügen" angezeigt.)

3
stormwild

Wofür es sich lohnt, die bestimmte Variation dieses Problems zu haben, die ich hatte:

  • SQL Express 2008
  • Visual Studio 2010 Premium

Über das Kontextmenü des Ordners "App_data" habe ich eine SQL Express-Datenbank zum Debuggen erstellt. Die Verbindungszeichenfolge (von NHibernate verwendet) lautete wie folgt:

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

Dies gab mir den gleichen "Zugriff verweigert" Fehler in der Datenbankdatei. Ich habe versucht, verschiedenen Benutzern Vollzugriff auf Ordner und Dateien zu geben, zu einem Zeitpunkt sogar auf "Jeder". Nichts hat geholfen, also habe ich die hinzugefügten Berechtigungen wieder entfernt.

Was schließlich gelöst wurde war, den Server-Explorer in Visual Studio zu öffnen, dann eine Verbindung zum MDF herzustellen und es wieder zu trennen. Nachdem ich das getan hatte, konnte meine Web-App problemlos auf die Datenbank zugreifen.

PS. Credits gehen an diesen Blog-Beitrag Ich habe beim Googeln dieses speziellen Problems gefunden und die Idee ausgelöst, die Datenbank anzuhängen/zu trennen, um das Problem zu lösen.

2
Jeroen

 enter image description here

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

ändern FOR ATTACH -> FOR ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO
1
Valentin Petkov

Ich habe diese Fehlermeldung als sa ..__ bekommen. In meinem Fall spielte die Datenbanksicherheit keine Rolle . Ich fügte allen mdf- und ldf-Dateien jeden Vollzugriff hinzu.

1
toddmo

Ich hatte das gleiche Problem beim Anfügen einer Datenbank. Es war kein SQL-Problem, sondern ein Kontoproblem. Gehen Sie zur Systemsteuerung/Benutzerkontensteuerungseinstellungen/Auf "Keine Benachrichtigung" setzen. Starten Sie den Computer neu und es hat für mich funktioniert.

1
Paola

Ich habe die MDF-Datei angefügt, indem Sie mit der rechten Maustaste auf die Datenbank geklickt und die Protokolldatei AdventureWorks2012_Data_log.ldf im Assistenten entfernt. Die MDF-Datei wurde an folgendem Speicherort abgelegt 

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

Die obige Methode half mir, das Problem zu lösen.

1
praveen

Ich las diese Seite und sie haben einen interessanten Satz drin:

Achtung: Seien Sie beim Hinzufügen von .__ sehr wählerisch. Benutzer zu diesen Rollen. Zum Beispiel, sysadmin kartiert sich in jedem Datenbank und ist das Äquivalent von sich mit dem sa-konto anmelden.

Natürlich haben sie auch folgendes:

Berechtigungen, die Benutzern gewährt werden und Rollen und sind datenbankspezifisch . Alle Berechtigungen sind mit .__ kumuliert. die Ausnahme eines DENY. A abgelehnt Berechtigung auf Benutzerebene oder auf einer Rollenebene überschreibt das gleiche Erlaubnis über andere Rolle Mitgliedschaften mit Ausnahme der feste Serverrolle sysadmin. (Ein Sysadmin behält alle Berechtigungen, auch Wenn eine Rolle, deren Mitglied sie sind, über die Berechtigung DENY verfügt.) 

Wenn Sie also ein Domänenadministrator und in der SQL-Gruppe "sysadmin" sind, sollte die Welt Ihr Krustentier sein.

Natürlich sollten Sie laut Microsoft diese beiden Seiten kurz betrachten:
Link zu Datenbankvoraussetzungen

Link zur Installation von Datenbanken

Sie sind unartig und versuchen, sie manuell anzulegen :) Haben Sie jedoch alle Voraussetzungen für die AdventureWorks 2008-Datenbank?
Ich vermute, dass dies nur ein weiterer Fall von Microsoft ist, aber ich könnte mich irren.

1
Trevoke

Das klingt nach NTFS-Berechtigungen. Normalerweise hat Ihr SQL Server-Dienstkonto nur Lesezugriff auf die Datei (beachten Sie, dass SQL Server dasselbe Dienstkonto für den Zugriff auf Datenbankdateien verwendet, unabhängig von der Art der Anmeldung). Sind Sie sicher, dass Sie die Ordnerberechtigungen zwischen dem Anmelden als sich selbst und dem Anmelden als sa nicht geändert haben? Wenn Sie das Problem lösen und es erneut versuchen, hat es immer noch dasselbe Problem?

1
Adrian O'Connor

Ich habe eine Datenbank-MDF aus dem Standarddatenordner in meinen asp.net-Ordner app_data verschoben und dieses Problem ist beim Versuch aufgetreten, die Datenbank wieder online zu setzen. 

Ich habe die Sicherheitseinstellungen der anderen Dateidatenbanken am ursprünglichen Speicherort mit den verschobenen Dateien verglichen und festgestellt, dass MSSQL $ SQLEXPRESS keine Berechtigungen für die Dateien am neuen Speicherort zugewiesen wurden. Ich fügte Vollzugriff für "NT SERVICE\MSSQL $ SQLEXPRESS" hinzu (muss den NT SERVICE enthalten), und es wurde einfach angeschlossen.

Es scheint, dass der ursprüngliche Datenordner über diese Berechtigungen verfügt und die Dateien ihn erben. Verschieben Sie die Dateien und die Vererbungspausen natürlich.

Ich habe die MDF-Datei eines anderen Projekts, die ich direkt erstellt habe, in den Ordner app_data geprüft. Es verfügt nicht über MSSQL $ SQLEXPRESS-Berechtigungen. Hmmm. Ich frage mich, warum SQL Express eins mag, das andere aber nicht?

1
Brad Mathews

Für diejenigen, die das Problem mit den anderen Lösungen hier nicht beheben konnten, funktionierte der folgende Fix für mich:

Wechseln Sie zu Ihrem Ordner "DATA" in Ihrer SQL Server-Installation, klicken Sie mit der rechten Maustaste auf Eigenschaften, Registerkarte Sicherheit, und fügen Sie Vollzugriffsberechtigungen für den Benutzer "NETWORK SERVICE" hinzu.

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(Der obige Link ist für SQL 2005, dies hat jedoch eine SQL 2008 R2-Installation für mich behoben).

Einige zusätzliche Informationen: Dieses Problem trat für mich auf, nachdem eine sekundäre Festplatte ersetzt wurde (auf der die SQL-Installation war). Ich habe alle Dateien kopiert und den ursprünglichen Laufwerksbuchstaben auf der neuen Festplatte wiederhergestellt. Die Sicherheitsberechtigungen wurden jedoch nicht kopiert. Ich denke, beim nächsten Mal werde ich eine bessere Methode zum Kopieren von Daten verwenden. 

0
nuzzolilo

Es handelt sich tatsächlich um NTFS-Berechtigungen und einen merkwürdigen Fehler in SQL Server. Ich bin nicht sicher, ob der obige Fehlerbericht korrekt ist oder auf einen zusätzlichen Fehler verweist.

Um dieses Problem unter Windows 7 zu beheben, habe ich SQL Server Management Studio normal ausgeführt (nicht als Administrator). Ich habe dann versucht, die MDF -Datei anzufügen. Dabei habe ich die Benutzeroberfläche verwendet und nicht in den Pfad eingefügt. Ich bemerkte, dass der Weg von mir abgeschnitten war. Dies ist darauf zurückzuführen, dass der Benutzer der MS SQL Server-Benutzer (SQLServerMSSQLUser $ machinename $ SQLEXPRESS), den die Software für Sie hinzufügt, keine Zugriffsberechtigung für den Ordner hat (in diesem Fall ein Ordner tief in meinen eigenen Benutzerordnern).

Wenn Sie den Pfad einfügen und fortfahren, wird der obige Fehler angezeigt. Also - Ich habe dem MS SQL Server-Benutzer die Leseberechtigung erteilt, beginnend mit dem ersten Verzeichnis, in dem er abgelehnt wurde (mein Benutzerordner). Ich habe dann den Ausbreitungsvorgang sofort abgebrochen, da dies eine Ewigkeit dauern kann, und wendete erneut Leseberechtigungen für den nächsten erforderlichen Unterordner an und ließ dies vollständig verbreiten.

Schließlich habe ich dem MS SQL Server-Benutzer die Berechtigung zum Ändern der MDF- und LDF-Dateien für die Datenbankbibliothek erteilt.

Ich kann jetzt an die Datenbankdateien anhängen.

0
Chris Moschini

Ich hatte das gleiche Problem, als ich die Datenbank nach dem Trennen wieder anfügte und ldf- und mdf-Dateien von Laufwerk C auf F verschob. 

Um das Problem zu beheben, musste ich OWNER RIGHTS Principal zu beiden Dateien hinzufügen und ihm auf der Registerkarte Sicherheit des Dialogfelds Eigenschaften die vollständige Kontrolle darüber geben.

0
Art

Ich habe das Problem gelöst, indem Sie einfach die .mdf-Datei, die Sie anhängen möchten, in den öffentlichen Ordner verschieben. In meinem Fall habe ich sie in den Ordner users/public verschoben. Dann befestige ich es von dort ohne Probleme. Hoffe das hilft.

0
databaseUser

In meinem Fall wurde das Problem gelöst:

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG
0
Nick_

Datenbank in einen anderen Ordner kopieren und mit "Windows-Authentifizierung" anhängen oder in SQLServer anmelden

enter image description here

0
Chưa biết

Ich hatte Schwierigkeiten mit SSMS (2016), um die AdventureWorks2012-Datenbank anzufügen. Aber hatte Erfolg mit diesem Code, entnommen aus einem CodeProject-Artikel von Mohammad Elsheimy :

CREATE DATABASE AdventureWorks2012
    ON PRIMARY (FILENAME='D:\Dev\SQL Server\AdventureWorks2012.mdf')
    FOR ATTACH;
0
Michael Melio

Wenn Sie SQL Server 2012 ausführen, können Sie diese Fehlermeldung erhalten, indem Sie versuchen, eine ältere Version einer MDF-Datei anzuhängen. ex eine Mdf-Datei von SQL Server 2008.

0
Erik Forsmyr