こんにちは。SQL Server サポート チームです。
今回は、Windows 上で動作するSQL Server の異なるインスタンス間で、ログインとパスワードを転送する方法についてご案内します。
SQL Server ではインスタンスに接続する際の認証に使用する(サーバー全体の権限を管理する)ログインという名称のプリンシパルと、インスタンスに接続した後に各データベースに接続する際の認証に使用する(データベースの権限を管理する)ユーザーという名称のプリンシパルが存在します。
本記事ではログインという表記の場合はログインプリンシパルを表し、ユーザーという表記の場合はユーザープリンシパルを意図したものとなります。
一般的にクライアントは、ログインプリンシパルを指定して SQL Server のインスタンスに接続し、ログインプリンシパルとマッピングされたユーザープリンシパルの権限を用いて、データベースにアクセスします。
下記図のようになります。
■概要
Server A で稼働しているインスタンスにあるデータベースを、別の Server B のインスタンスに移行(バックアップリストア/デタッチアタッチなど)すると、以下のようなエラーが発生して、Server B のインスタンスに接続ができない場合があります。
ユーザー ‘ ログイン名 ‘の ログインに 失敗しました。 (Microsoft SQL Serverエラー: 18456)
この問題は、Server A の SQL Server のインスタンスに存在していたログインが、Server B の SQL Server のインスタンスに存在しないために発生することがあります。
下記図が問題のイメージです。
また、Server B のインスタンスに Server A と同じ名称のログインを作成して、Server B に移行したデータベースにアクセスしようとしたときに下記のようなエラーが発生して、データベースに接続ができない場合があります。
現在のセキュリティ コンテキストでは、サーバー プリンシパル « <ログイン名> » はデータベース « <データベース名> » にアクセスできません。
この問題は、Server A と Server B でログインの名称が同じでも内部的にログインを識別する SID が異なっていることが原因で発生します。
下記図が問題のイメージです。
本記事では、Server A のインスタンスに存在するログインをパスワードを保ったまま別の Server B のインスタンスにコピーする対応策について紹介します。
■前提条件
・本作業はすべて sysadmin ロールの権限を持ったログインにて実施します。