データベース プリンシパルは、データベースの スキーマ を所有しているので、削除できません
SQL SERVERでバックアップしたファイルを別PC環境に復元してから、ODBC接続を試みるも、ログインできないというメッセージが出てドライバを作成できない。そこでサーバのログイン情報を見ると、ユーザマッピングに当該データベースへのチェックが入っていないので、入れようと思うが、「ユーザーまたはロール ‘%s’ は現在のデータベースに既に存在します。」というメッセージが出てチェックが入らない。そこでデータベース側の存在するそのログインを削除しようとするが、「データベース プリンシパルは、データベースの スキーマ を所有しているので、削除できません」というメッセージが出て削除ができない。これを削除できるようにする方法として、下記のような記事がサイトにあった。
****************************************
SQL Server でユーザを削除しようとしたんだけど、このメッセージが出て削除できない・・・。
SQL Server Management Studio で、”このユーザーが所有するスキーマ”にチェックすると、なんでか知らないがチェックを外すことができなくなり(チェックボックスがチェックでなくて色が付いてる状態になっちゃう)そのスキーマを所有したままになるので、削除できなくなるようです。
<直し方>
①まずはそのチェックがはずれなくなったユーザのスキーマと同名の、スキーマのプロパティを開きます。
②すると「スキーマ名」と「スキーマの所有者」という欄が出てきます。
多分「スキーマの所有者」欄が「スキーマ名」と異なっているのではないかと思います。
④そこで「スキーマの所有者」欄の内容を「スキーマ名」と同じにしてOKを押します。
いくつもチェックしていたら、その分同じ事をしましょう。
全て直したら、今度はユーザを削除しましょう!削除できるはず!
*********************************
この手順に従って、ログインを削除することが出来るようになり、その後で改めて、サーバのログインからユーザマッピングをしたところ、無事に関連づけることができた。そしてODBCドライバも作成することができた。
別のサーバーでバックアップしたファイルを復元するときには、必ずこのマッピングが必要になるのだろうか。
そのまますんなり接続出来るケースもあり、疑問が残る。
ただ、きちんとユーザマッピングがされている場合は、データベースユーザの「全般」タブで、「ユーザの種類」が「ログインを持つユーザ」となり、なされていない場合は「ログインを持たないユーザ」となる。この場合は、接続ができないということがわかった。
以下参考文章
SqlServerログインとデータベースユーザーのマッピングについて解説しています。
用語
データベースユーザー…SSMSの[DB]-[セキュリティ]-[ユーザ]内にあるアカウント
SQL serverログイン…SSMSの[セキュリティ]-[ログイン]内にあるアカウント
なぜマッピングが必要か?
例えば開発時において、本番サーバーのDBのバックアップファイルを開発用マシンに復元した場合、本番サーバー時のデータベースユーザー「userA」で接続しようとしても出来ません。
理由は「userA」が開発用SQLのログインに登録されていないために起こる現象です。
一般的な誤り
通常まず最初に思い浮かぶのは、「SQLserverログインを追加すればよいのでは?」だと思います。私も同じように考えました。
ではまず、開発用SQLserverにログイン「userA」を追加してSQLserverに接続を試みます。
しかしこれだけでは接続できません。
理由は、開発用SQLserverに登録されているデータベースユーザー「userA」とログイン「userA」がマップされていない(関連付けがされていない)ためです。
名前は同じ「userA」でも、内部的に関連付けるための「sid」が異なるのです。双方のsidが一致してこそ初めて「ログイン’userA’は、データベースユーザー’userA’と同じ」と見なされるのです。
マッピングの方法
したがって、sidを共通化させる事ができれば、データベースユーザー「userA」がログイン「userA」にマップされる事になります。
この操作は以下のとおりです。
use
EXEC sp_change_users_login ‘Update_One’,’
GO
Update_One
固定文句です。公式サイトでは「現在のデータベースに存在する、指定した user を、既存の SQL Server login にリンクします。user および login を指定する必要があります。password は NULL にするか、指定しないでください。」
データベースユーザー名
ログイン名。予め手動で登録する必要あり