カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

リストア後のDBでUser Mappingができない場合にやったこと(SQL Server)

あるSQL Serverで取得したBackupを他のSQL Serverで復元した際に、そのDBに作成済みのユーザーをマッピングさせようとしたら以下のエラーがでたので、対応した内容を備忘で残しておきます。

User, group, or role 'distributor_admin' already exists in the current database. (Microsoft SQL Server, Error: 15023)

実施作業

背景

自分が前に構築した以下の2つのSQL Serverのうち、レプリケーション元のDBをバックアップしてレプリケーション先のSQL Serverで復元したあとに、別途作成しておいたユーザー(distributor_admin)でそのDBへのユーザーマッピングを行おうとしたところ、エラーが発生しました。(エラー内容は冒頭確認)
capybara-engineer.hatenablog.com

結論

先に結論だけ書いておくと、以下のコマンドをレプリケーション先のSQL Serverで実行したら解消しました。

exec sp_change_users_login @Action = 'Update_One'
	,@UserNamePattern = 'distributor_admin'
	,@LoginName = 'distributor_admin'


やったこと

最初にエラー内容でGoogle検索してヒットした以下のURLを確認しました。
ardalis.com

そこでどうやら「sp_change_users_login(Transact-SQL)」を使用すれば解決できると書いてあったので、公式のそのページを確認してみます。


↓こちら↓
docs.microsoft.com


確認すると以下の説明が書いてました。

既存のデータベースユーザーをSQL Serverログインにマップします。



既存のデータベースユーザー??
SQL Serverログインは別途作成したSQL Serverユーザーだとわかるけど、この既存のデータベースユーザーとは何ぞや?


で、色々探していたら見つけました。
f:id:live-your-life-dd18:20200417095521p:plain


これは完全に自分の知識不足だったんですが、SQL Serverって2種類のユーザーがあるんですね。(SQL Server初心者)
sql-oracle.com


ログインユーザーを作成時にユーザーマッピングでDBとマッピングさせると思うんですけど、マッピングさせて作成するとその時点でデータベースユーザーにも追加(作成)されるようです。


今回はリストアしたDBのデータベースユーザーに同名のユーザーが既に存在していたため、マッピング時のデータベースユーザーの作成で失敗していたことが原因でした。


そのため、結論に書いたコマンドでSQL ServerのログインユーザーとDB内のデータベースユーザーをマッピングしてあげることで問題が解決できた、ということでした。


また一つ勉強になりました。