db_owner kann Datenbank nicht löschen - Fehler 615, SQL Server


11

Ich habe eine SQL Server 2012-Datenbank, die auf Amazon EC2 ausgeführt wird. Ich habe einen Benutzer erstellt, der Datenbanken erstellen, bearbeiten und löschen kann. Ich habe dem neuen Benutzer eine dbcreatorServerrolle zugewiesen.

Mein Benutzer kann eine Remoteverbindung herstellen und den create database foo;Befehl erfolgreich ausführen. Wenn der Benutzer jedoch versucht, die Datenbank mit drop database foo;dem Befehl erneut zu löschen, schlägt der folgende Fehler fehl:

Warning: Fatal error 615 occurred at Feb  1 2014  5:15PM.
   Note the error and time, and contact your system administrator.
ErrorCode: 21

Auch wenn die ausgewählte Datenbank ist master(ich glaube also nicht, dass sie verwendet wird). Und der Befehl ist erfolgreich, wenn ich ihn erneut ausführe und als Administrator angemeldet bin.

Ich habe die neu erstellte Datenbank überprüft, und meinem Benutzer wurde die db_ownerRolle in der Datenbank wie erwartet zugewiesen. Meines Erachtens sollte dies eine ausreichende Berechtigung sein, damit dieser Benutzer die gerade erstellte Datenbank löschen kann.

Geben Sie hier die Bildbeschreibung ein

Laut http://technet.microsoft.com/en-us/library/ms178613.aspx sollte die Rolle db_owner über ausreichende Berechtigungen verfügen. "Erfordert die Berechtigung CONTROL für die Datenbank oder die Berechtigung ALTER ANY DATABASE oder die Mitgliedschaft in der festen Datenbankrolle db_owner."

Ich habe Fehler 615 nachgeschlagen und festgestellt, dass die Datenbanktabellen-ID% d mit dem Namen '%. * Ls' nicht gefunden werden konnte. " das macht für mich keinen sinn. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

SQL Server Versionsinfo: Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64) /n May 22 2013 17:10:44 /n Copyright (c) Microsoft Corporation/n Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)/n- von select @@version.

Antworten:


12

Ich kann mir vorstellen, dass Sie die AutoClose-Option für die Datenbank auf True gesetzt haben. Dies ist das Standardverhalten, wenn Sie eine Datenbank mit Express Editions erstellen.

Der erwähnte Fehler kann genau in diesem Fall auftreten. Tatsächlich lautet die vollständige Fehlermeldung 615: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Sie weist also darauf hin, dass die Datenbank beim Löschen geschlossen werden könnte.

Gehen Sie also zu den DB-Eigenschaften, wechseln Sie zu False und versuchen Sie erneut, sie zu löschen, oder verwenden Sie das folgende Skript, bevor Sie sie löschen

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Viele weisen darauf hin, dass es besser ist, AutoClose auf False zu setzen. Ich fand diesen Artikel, der etwas mehr über AutoClose erklärt: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Kleine Erweiterung der Antwort:

-- this works in standard SQL Server Editions, but NOT with Express Editions:
CREATE DATABASE [MyDB]
GO
DROP DATABASE [MyDB]
GO

-- this works in ALL SQL Server Editions
CREATE DATABASE [MyDB]
GO
ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO
DROP DATABASE [MyDB]
GO

2

Die von Ihnen beschriebene Konfiguration sollte in Ordnung sein.

Besteht die Möglichkeit, dass Sie tatsächlich versuchen, die Datenbank als anderer Benutzer zu löschen?

Ich würde empfehlen, als Testbenutzer eine Verbindung mit SSMS herzustellen, um 100% sicher zu sein, dass Sie dieser Benutzer sind. Bevor Sie die Datenbankprüfung löschen, können Sie auf einige Daten zugreifen. Vielleicht können Sie auch testen, ob Sie sie in den Einzelbenutzermodus versetzen können, was Sie letztendlich sowieso tun müssen


Ich habe in der Tat versucht, mit SSMS direkt auf dem Server eine neue Verbindung mit den Anmeldeinformationen dieses Benutzers herzustellen. Gleiches Ergebnis wie aus der Ferne. Ich habe es gerade überprüft und der Benutzer kann tatsächlich eine Tabelle erstellen, eine Zeile einfügen und die Zeile erfolgreich zurücklesen. Ich habe vor dem Ausführen der Abfrage in ssms überprüft, ob der richtige Benutzer angezeigt wurde, aber nach dem Ausführen der drop-Anweisung wurde "nicht verbunden" geändert. Ich denke, das liegt nur daran, dass es ein schwerwiegender Fehler ist, aber ich hatte das vorher noch nicht bemerkt.
Tim Abell

2
@ Tim: Ja, Fehler der Stufe 20 und höher trennen die Verbindung, das ist also nur ein Symptom. Gibt das SQL Server-Fehlerprotokoll oder das Anwendungsereignisprotokoll weitere Informationen?
Jon Seigel

Ich fürchte, ich hatte keine Gelegenheit, darauf zurückzukommen, um es zu überprüfen, aber danke für den Tipp. Ich werde die Protokolle überprüfen, wenn ich das nächste Mal nachschaue (nicht sicher, wann das sein wird).
Tim Abell

0

Ich habe die Ursache dafür nicht gefunden, aber die folgende, obwohl nicht beste Lösung, aktiviert den Befehl.

Ich hoffe, es weist auf das Problem hin und jemand kann eine bessere Antwort geben.

Ich verwende Microsoft SQL Server Management Studio (Administrator) unter localhost Security-Anmeldungen

Doppelklicken Sie auf Benutzer, wählen Sie Serverrollen aus, geben Sie dbcreator, public und sysadm an.

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.