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.

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

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ć


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.