SQL Management Studio を使って、SQL Server の保守作業をしていたときのこと。
ほかのサーバーから移設したりなど、いろいろな経緯があって、いくつか無用なデータベースユーザーが残ってしまったデータベースがあった。
さてということで、このデータベースユーザーを SQL Management Studio 上から削除しようとした。
当該データベースユーザーを右クリック -> コンテキストメニューから [削除(D)] を選択して、「オブジェクトの削除」ダイアログにて [OK] をクリックする。
いつもならこれでデータベースユーザーは削除できておしまいなのだが、今回はちょっと勝手が違った。
エラーになってしまったのである。
エラーメッセージはこんな感じ。
ユーザー 'hoge' の削除に失敗しました。 (Microsoft.SqlServer.Express.Smo)
Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.Express.ConnectionInfo)
データベース プリンシパルは、データベースの スキーマ を所有しているので、削除できません。 (Microsoft SQL Server、エラー: 15138)
かなり苦労してあちこち調べた。
その結果、次の手順で削除できる、ということがようやくわかった。
-- いったん、ユーザーと、そのユーザー名と同名のスキーマを明示的に関連付け、
ALTER USER hoge WITH DEFAULT_SCHEMA = hoge
-- そのスキーマを明示的に削除してから、
DROP SCHEMA hoge
-- ユーザーを削除。
DROP USER hoge
GO
「スキーマ を所有しているので削除できません」などというエラーに遭遇するのはレアケースだとは思うが、レアケースであるが故に情報が少ないせいか、対応に困難した。
なかなかに難しいものですね。