db_ownerがデータベースを削除できません-エラー615、SQL Server


11

Amazon EC2でSQL Server 2012データベースを実行しています。データベースを作成、編集、削除できるユーザーを作成しました。新しいユーザーにdbcreatorサーバーの役割を与えました。

ユーザーはリモートで接続してcreate database foo;コマンドを正常に実行できます。しかし、ユーザーdrop database foo;がコマンドを使用してデータベースを再度削除しようとすると、次のエラーで失敗します。

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

選択されたデータベースは使用中ですmaster(そのため、使用中だからとは思いません)。また、管理ユーザーとしてログインして再度実行すると、コマンドは成功します。

新しく作成したデータベースを確認しましたが、ユーザーdb_ownerにはデータベース内のロールが期待どおりに割り当てられているので、作成したデータベースを削除するには、これで十分です。

ここに画像の説明を入力してください

http://technet.microsoft.com/en-us/library/ms178613.aspxによると、db_ownerロールは十分な権限である必要があります。「データベースのCONTROL権限、ALTER ANY DATABASE権限、またはdb_owner固定データベースロールのメンバーシップが必要です。」

エラー615を検索し、「データベーステーブルID%d、名前 '%。* ls'が見つかりませんでした。」を見つけました。私には意味がありません。http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

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-からselect @@version

回答:


12

データベースのAutoCloseオプションがTrueに設定されていると思います。これは、Express Editionでデータベースを作成するときのデフォルトの動作です。

この場合、上記のエラーが発生する可能性があります。実際、完全なエラーメッセージ615は次のように述べています"Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."。...ドロップ中にデータベースが閉じられる可能性があることを示しています。

したがって、DBプロパティに移動し、Falseに切り替えて、もう一度ドロップするか、ドロップする前に以下のスクリプトを使用してください。

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

AutoCloseをFalseに設定する方が良いと多くの人が指摘しています。AutoCloseについてもう少し説明しているこの記事を見つけました:http ://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

答えの小さな拡張:

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

あなたが説明する設定は問題ないはずです。

実際に別のユーザーとしてデータベースを削除しようとしている可能性はありますか?

SSMSを使用してテストユーザーとして接続し、自分がそのユーザーであることを100%確認することをお勧めします。また、データベースチェックを削除する前に、そこから一部のデータにアクセスできます。また、テストして、シングルユーザーモードに設定して、最終的にはとにかく行う必要があると思います。


実際、サーバー上で直接SSMSを使用して、このユーザーの資格情報で新しい接続を確立しようとしました。リモートと同じ結果。チェックしたところ、ユーザーは実際にテーブルを作成し、行を挿入して、行を正常に読み取ることができます。ssmsでクエリを実行する前に正しいユーザーが表示されていることを再確認しましたが、dropステートメントを実行した後、「接続されていません」に変わりました。それは致命的なエラーだと思うが、今まで気づかなかった。
Tim Abell、2014

2
@ティム:はい、レベル20以上のエラーは接続を落とすので、それは単なる症状です。SQL Serverエラーログまたはアプリケーションイベントログに詳細情報はありますか?
Jon Seigel、2014

確認するためにこれに戻る機会がなかったと思いますが、ヒントをありがとう。次回これを調べたときに、ログを確認します(いつになるかわかりません)。
Tim Abell、2014

0

この原因はわかりませんでしたが、次の最善策ではなくコマンドを有効にします。

それが問題を指摘し、誰かがより良い答えを提供できることを願っています。

Microsoft SQL Server Management Studio(管理者)をlocalhostセキュリティログインの下で使用しています

ユーザーをダブルクリックし、[サーバーの役割]を選択して、dbcreator、public、およびsysadmを付与します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.