db_owner impossibile eliminare il database - Errore 615, SQL Server


11

Ho un database SQL Server 2012 in esecuzione su Amazon EC2. Ho creato un utente per poter creare, modificare e eliminare database. Ho assegnato al nuovo utente dbcreatorun ruolo server.

Il mio utente può connettersi in remoto ed esegue correttamente il create database foo;comando. Ma quando l'utente tenta di eliminare nuovamente il database con drop database foo;il comando non riesce con il seguente errore:

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

Anche se il database selezionato è master(quindi non penso che sia perché è in uso). E il comando ha esito positivo quando lo eseguo di nuovo effettuato l'accesso come utente amministrativo.

Ho controllato il database appena creato e al mio utente è stato assegnato il db_ownerruolo nel database come mi aspettavo, quindi la mia comprensione è che questo dovrebbe essere autorizzazioni sufficienti per consentire a quell'utente di eliminare il database che ha appena creato.

inserisci qui la descrizione dell'immagine

Secondo http://technet.microsoft.com/en-us/library/ms178613.aspx il ruolo db_owner dovrebbe essere autorizzazioni sufficienti. "Richiede l'autorizzazione CONTROL sul database o l'autorizzazione ALTER ANY DATABASE o l'appartenenza al ruolo predefinito del database db_owner."

Ho cercato l'errore 615 e ho trovato "Impossibile trovare l'ID della tabella del database% d, nome '%. * Ls'." che non ha senso per me. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Informazioni sulla versione del server 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- da select @@version.

Risposte:


12

Immagino che tu abbia l'opzione AutoClose per il database impostato su True. Questo è il comportamento predefinito quando si crea un database con Express Editions.

L'errore menzionato può verificarsi esattamente in questo caso. In realtà il messaggio di errore completo 615 indica: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Quindi indica che il database potrebbe essere chiuso durante l'eliminazione.

Quindi, vai alle proprietà del DB, passalo a False e riprova a lasciarlo cadere o usa lo script sottostante prima di rilasciarlo

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Molti sottolineano che è meglio che AutoClose sia impostato su False. Ho trovato questo articolo che spiega un po 'di più su AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-database

Piccola estensione della risposta:

-- 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

La configurazione che descrivi dovrebbe andare bene.

C'è qualche possibilità che tu stia effettivamente tentando di eliminare il database come un altro utente?

Consiglio di connettersi come utente di prova utilizzando SSMS per essere sicuro al 100% che tu sia quell'utente. Inoltre, prima di abbandonare il controllo del database puoi accedere ad alcuni dati da esso, forse anche test puoi metterlo in modalità utente singolo che immagino dovresti comunque fare alla fine


Ho effettivamente provato con SSMS direttamente sul server, stabilendo una nuova connessione con le credenziali di questo utente. Stesso risultato di remoto. Ho appena controllato e l'utente può effettivamente creare una tabella, inserire una riga e rileggere la riga correttamente. Ho ricontrollato che l'utente corretto stava mostrando prima di eseguire la query in ssms e lo era, ma dopo aver eseguito l'istruzione drop è cambiato in "non connesso". Immagino sia solo perché è un errore fatale ma non me ne ero accorto prima d'ora.
Tim Abell,

2
@Tim: Sì, gli errori di livello 20 e superiore interrompono la connessione, quindi è solo un sintomo. Il registro errori di SQL Server o il registro eventi dell'applicazione fornisce ulteriori informazioni?
Jon Seigel,

Temo di non aver avuto la possibilità di tornare su questo per verificare, ma grazie per il suggerimento. Controllerò i registri la prossima volta che lo esaminerò (non sono sicuro di quando sarà).
Tim Abell,

0

Non ho trovato la causa per questo, ma la seguente soluzione, sebbene non migliore, abilita il comando.

È mia speranza che indichi il problema e qualcuno possa fornire una risposta migliore.

Uso Microsoft SQL Server Management Studio (amministratore) in accessi di sicurezza localhost

Fare doppio clic su utente, selezionare Ruoli server, fornire dbcreator, public e sysadm.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.