db_owner ne peut pas supprimer la base de données - Erreur 615, SQL Server


11

J'ai une base de données SQL Server 2012 fonctionnant sur amazon EC2. J'ai créé un utilisateur pour pouvoir créer, éditer et supprimer des bases de données. J'ai donné au nouvel utilisateur dbcreatorun rôle de serveur.

Mon utilisateur peut se connecter à distance et exécute correctement la create database foo;commande. Mais lorsque l'utilisateur tente de supprimer à nouveau la base de données avec drop database foo;la commande échoue avec l'erreur suivante:

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

Même si la base de données sélectionnée est master(donc je ne pense pas que ce soit parce qu'elle est utilisée). Et la commande réussit lorsque je l'exécute à nouveau en tant qu'utilisateur administrateur.

J'ai vérifié la base de données nouvellement créée et mon utilisateur s'est vu attribuer le db_ownerrôle dans la base de données comme je m'y attendais, donc je comprends que cela devrait être des autorisations suffisantes pour que cet utilisateur puisse supprimer la base de données qu'il vient de créer.

entrez la description de l'image ici

Selon http://technet.microsoft.com/en-us/library/ms178613.aspx, le rôle db_owner devrait avoir des autorisations suffisantes. "Nécessite l'autorisation CONTROL sur la base de données, ou l'autorisation ALTER ANY DATABASE, ou l'appartenance au rôle de base de données fixe db_owner."

J'ai recherché l'erreur 615 et trouvé "Impossible de trouver l'ID de table de base de données% d, nom '%. * Ls'." ce qui n'a aucun sens pour moi. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Informations sur la version du serveur 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- de select @@version.

Réponses:


12

Je suppose que vous avez l'option AutoClose pour la base de données définie sur True. Il s'agit du comportement par défaut lorsque vous créez une base de données avec Express Editions.

L'erreur mentionnée peut se produire exactement dans ce cas. En fait, le message d'erreur complet 615 indique: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Il indique donc que la base de données pourrait être fermée pendant la suppression.

Alors, allez dans les propriétés de la base de données, passez-le à False et essayez à nouveau de le supprimer ou utilisez le script ci-dessous avant de le supprimer

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Beaucoup soulignent qu'il vaut mieux avoir AutoClose défini sur False. J'ai trouvé cet article expliquant un peu plus sur AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Petite extension de la réponse:

-- 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 configuration que vous décrivez devrait être correcte.

Y a-t-il une chance que vous tentiez de supprimer la base de données en tant qu'utilisateur différent?

Je vous recommande de vous connecter en tant qu'utilisateur de test à l'aide de SSMS pour être sûr à 100% que vous êtes bien cet utilisateur. De plus, avant de supprimer la vérification de la base de données, vous pouvez accéder à certaines données de celle-ci, peut-être également tester que vous pouvez la mettre en mode mono-utilisateur, ce que je suppose que vous devrez finalement faire de toute façon


J'ai en effet essayé avec SSMS directement sur le serveur, établissant une nouvelle connexion avec les informations d'identification de cet utilisateur. Même résultat qu'à distance. Je viens de vérifier et l'utilisateur peut en effet créer un tableau, insérer une ligne et lire la ligne avec succès. J'ai revérifié l'utilisateur correct avant d'exécuter la requête dans ssms et c'était le cas, mais après avoir exécuté l'instruction drop, il est devenu "non connecté". Je suppose que c'est juste parce que c'est une erreur fatale, mais je ne l'avais pas remarqué auparavant.
Tim Abell

2
@Tim: Oui, les erreurs de niveau 20 et supérieur interrompent la connexion, ce n'est donc qu'un symptôme. Le journal des erreurs SQL Server ou le journal des événements d'application donne-t-il plus d'informations?
Jon Seigel

Je crains de ne pas avoir eu l'occasion d'y revenir pour vérifier, mais merci pour le conseil. Je vérifierai les journaux la prochaine fois que j'examinerai cela (je ne sais pas quand ce sera le cas).
Tim Abell

0

Je n'ai pas trouvé la cause de cela, mais la solution suivante, bien que pas la meilleure, active la commande.

J'espère que cela indique le problème et que quelqu'un peut fournir une meilleure réponse.

J'utilise Microsoft SQL Server Management Studio (administrateur) sous les connexions de sécurité localhost

Double-cliquez sur l'utilisateur, sélectionnez Rôles du serveur, donnez dbcreator, public et sysadm.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.