ある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ユーザーだとわかるけど、この既存のデータベースユーザーとは何ぞや?
で、色々探していたら見つけました。
これは完全に自分の知識不足だったんですが、SQL Serverって2種類のユーザーがあるんですね。(SQL Server初心者)
sql-oracle.com
ログインユーザーを作成時にユーザーマッピングでDBとマッピングさせると思うんですけど、マッピングさせて作成するとその時点でデータベースユーザーにも追加(作成)されるようです。
今回はリストアしたDBのデータベースユーザーに同名のユーザーが既に存在していたため、マッピング時のデータベースユーザーの作成で失敗していたことが原因でした。
そのため、結論に書いたコマンドでSQL ServerのログインユーザーとDB内のデータベースユーザーをマッピングしてあげることで問題が解決できた、ということでした。
また一つ勉強になりました。