db_owner nie może usunąć bazy danych - Błąd 615, SQL Server

11

Mam bazę danych SQL Server 2012 uruchomioną na Amazon EC2. Stworzyłem użytkownika, aby móc tworzyć, edytować i upuszczać bazy danych. Dałem nowemu użytkownikowi dbcreatorrolę serwera.

Mój użytkownik może połączyć się zdalnie i pomyślnie uruchamia create database foo;polecenie. Ale gdy użytkownik próbuje ponownie usunąć bazę danych za drop database foo;pomocą polecenia, kończy się niepowodzeniem z następującym błędem:

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

Mimo że wybrana baza danych jest master(więc nie sądzę, że jest używana). Polecenie kończy się powodzeniem, gdy uruchomię je ponownie zalogowany jako użytkownik administracyjny.

Sprawdziłem nowo utworzoną bazę danych, a mojemu użytkownikowi przypisano db_ownerrolę w bazie danych zgodnie z oczekiwaniami, więc rozumiem, że powinny to być wystarczające uprawnienia, aby ten użytkownik mógł usunąć utworzoną właśnie bazę danych.

wprowadź opis zdjęcia tutaj

Zgodnie z http://technet.microsoft.com/en-us/library/ms178613.aspx rola db_owner powinna być wystarczająca. „Wymaga uprawnienia CONTROL do bazy danych lub ZMIEŃ DOWOLNĄ bazę danych lub członkostwo w db_owner ustalonej roli bazy danych.”

Poszukałem błędu 615 i znalazłem „Nie można znaleźć identyfikatora tabeli bazy danych% d, nazwa '%. * Ls.” co nie ma dla mnie sensu. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Informacje o wersji serwera SQL: 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- z select @@version.

Tim Abell
źródło

Odpowiedzi:

12

Domyślam się, że masz opcję AutoClose dla bazy danych ustawioną na True. Jest to domyślne zachowanie podczas tworzenia bazy danych za pomocą Express Editions.

Wspomniany błąd może wystąpić dokładnie w tym przypadku. Właściwie kompletny komunikat o błędzie 615 stwierdza: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Oznacza to, że baza danych może zostać zamknięta podczas upuszczania.

Więc przejdź do właściwości DB, zmień na False i spróbuj ponownie upuścić lub użyj poniższego skryptu przed upuszczeniem

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Wielu wskazuje, że lepiej jest ustawić AutoClose na False. Znalazłem ten artykuł wyjaśniający nieco więcej o AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Małe rozszerzenie odpowiedzi:

-- 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
Uczeń
źródło
2

Opisana konfiguracja powinna być w porządku.

Czy jest jakaś szansa, że ​​próbujesz usunąć bazę danych jako inny użytkownik?

Polecam połączenie jako użytkownik testowy korzystający z SSMS, aby mieć 100% pewność, że jesteś tym użytkownikiem. Ponadto przed usunięciem sprawdzania bazy danych możesz uzyskać dostęp do niektórych danych, może też przetestować, aby przełączyć ją w tryb pojedynczego użytkownika, który, jak sądzę, ostatecznie musisz zrobić

Joel Mansford
źródło
Rzeczywiście próbowałem z SSMS bezpośrednio na serwerze, tworząc nowe połączenie z poświadczeniami tego użytkownika. Taki sam wynik jak zdalnie. Właśnie sprawdziłem, a użytkownik może rzeczywiście utworzyć tabelę, wstawić wiersz i pomyślnie odczytać wiersz. Dokładnie sprawdziłem poprawność wyświetlanego użytkownika przed wykonaniem zapytania w ssms i tak było, ale po uruchomieniu polecenia drop zmieniło się na „brak połączenia”. Myślę, że to tylko dlatego, że to fatalny błąd, ale nie zauważyłem tego wcześniej.
Tim Abell
2
@Tim: Tak, błędy poziomu 20 i wyższego przerywają połączenie, więc to tylko symptom. Czy dziennik błędów programu SQL Server lub dziennik zdarzeń aplikacji zawiera więcej informacji?
Jon Seigel
Obawiam się, że nie miałem okazji wrócić do tego, by sprawdzić, ale dziękuję za podpowiedź. Następnym razem sprawdzę dzienniki (nie jestem pewien, kiedy to będzie).
Tim Abell,
0

Nie znalazłem przyczyny tego, ale poniższe, choć nie najlepsze rozwiązanie, włącza polecenie.

Mam nadzieję, że wskazuje na problem i ktoś może udzielić lepszej odpowiedzi.

Używam Microsoft SQL Server Management Studio (Administrator) W loginach zabezpieczeń localhost

Kliknij dwukrotnie użytkownika, wybierz Role serwera, podaj dbcreator, public i sysadm.

DarrylBassett
źródło