適用対象:SQL Server
Azure SQL データベース
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
データベース ユーザーが master
データベース内のログインに基づいているが、ログインが master
に存在しなくなった場合、ユーザーは SQL Server で孤立します。 これは、ログインが削除されたとき、またはログインが存在しない別のサーバーにデータベースが移動されたときに発生する可能性があります。 この記事では、孤立したユーザーを検索し、ログインに再マップする方法について説明します。
注意
移動される可能性のあるデータベースには包含データベース ユーザーを利用し、孤立ユーザーの可能性を減らします。 詳細については、「包含データベースを使用してデータベースの可搬性を確保する」を参照してください。
バックグラウンド
ログインに基づいてセキュリティ プリンシパル (データベース ユーザー ID) を使用する SQL Server のインスタンス上のデータベースへの接続の場合、プリンシパルは master
データベースに有効なログインを持っている必要があります。 このログインは、プリンシパルの ID を検証し、プリンシパルが SQL Server のインスタンスへの接続を許可されているかどうかを判断する認証プロセスで使用されます。 サーバー インスタンスの SQL Server ログインは、 sys.server_principals カタログ ビューと sys.sql_logins 互換性ビューで表示できます。
SQL Server ログインは、SQL Server ログインにマップされた "データベース ユーザー" として個々のデータベースにアクセスします。 このルールには次の 3 つの例外があります。
包含データベース ユーザー
包含データベース ユーザーはユーザー データベース レベルで認証され、ログインには関連付けられません。 データベースの移植性が高く、包含データベース ユーザーが孤立することはできないため、このモデルをお勧めします。 ただし、データベースごとに再作成する必要があります。 多くのデータベースがある環境では、このモデルは実用的でない可能性があります。
ゲスト アカウント
データベースでこのアカウントを有効にすると、データベース ユーザーにマップされていない SQL Server ログインが ゲスト ユーザーとしてデータベースにアクセスできるようになります。 既定では、 guest アカウントは無効になっています。
Microsoft Windows グループ メンバーシップ
Windows ユーザーがデータベース内のユーザーでもある Windows グループのメンバーである場合、Windows ユーザーから作成された SQL Server ログインはデータベースにアクセスできます。
データベース ユーザーへの SQL Server ログインのマッピングに関する情報は、データベースに格納されます。 これには、データベース ユーザーの名前と、対応する SQL Server ログインのセキュリティ識別子 (SID
) が含まれます。 データベース内での承認には、このデータベース ユーザーの権限が適用されます。
対応する SQL Server ログインが定義されていないか、サーバー インスタンスで正しく定義されていないデータベース ユーザー (ログインに基づく) は、インスタンスにサインインできません。 このようなユーザーは、そのサーバー インスタンスのデータベースの 孤立ユーザー と呼ばれます。 孤立は、データベース ユーザーが、master
データベースに存在しないログイン SID
にマップされている場合に発生する可能性があります。 データベースを復元した後や、 SQL Server の別のインスタンスにアタッチしたが、そこではログインが作成されていないときも、孤立状態になることがあります。 データベース ユーザーは、対応する SQL Server ログインが削除された場合にも孤立状態になることがあります。 ログインが再作成された場合でも、別の SID
があるため、データベース ユーザーは孤立したままです。
孤立したユーザーを検出する
SQL Server および PDW の場合
不足している SQL Server 認証ログインに基づいて SQL Server で孤立したユーザーを検出するには、ユーザー データベースで次のステートメントを実行します。
SELECT dp.type_desc, dp.sid, dp.name AS user_name
FROM sys.database_principals AS dp
LEFT JOIN sys.server_principals AS sp
ON dp.sid = sp.sid
WHERE sp.sid IS NULL
AND dp.authentication_type_desc = 'INSTANCE';
出力には、SQL Server 認証ユーザーと、SQL Server ログインにリンクされていない現在のデータベース内の対応する SID が一覧表示されます。
Azure SQL Database と Azure Synapse Analytics の場合
sys.server_principals テーブルは、SQL Database または Azure Synapse Analytics では使用できません。 次の手順を実行して、これらの環境で孤立したユーザーを特定します。
master
データベースに接続し、次のクエリを使用してログインの SID を選択します。SELECT sid FROM sys.sql_logins WHERE type = 'S';
次のクエリを使用して、ユーザー データベースに接続し、
sys.database_principals
テーブル内のユーザーの SID を確認します。SELECT name, sid, principal_id FROM sys.database_principals WHERE type = 'S' AND name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys') AND authentication_type_desc = 'INSTANCE';
2 つのリストを比較して、ユーザー データベース
sys.database_principals
テーブルに、master
データベースsql_logins
テーブル内のログイン SID と一致しないユーザー SID があるかどうかを判断します。
孤立したユーザーを解決する
master
データベースで、SID
オプションと共に CREATE LOGIN ステートメントを使用して、不足しているログインを再作成します。 前のセクションで取得したデータベース ユーザーの SID
を指定します。
CREATE LOGIN <login_name>
WITH PASSWORD = '<use_a_strong_password_here>',
SID = <SID>;
孤立したユーザーを、 master
に既に存在するログインにマップするには、ユーザー データベースで ALTER USER ステートメントを実行し、ログイン名を指定します。
ALTER USER <user_name> WITH Login = <login_name>;
不足しているログインを再作成すると、ユーザーは指定されたパスワードを使用してデータベースにアクセスできます。 ユーザーは、 ALTER LOGIN
ステートメントを使用してログイン アカウントのパスワードを変更できます。
ALTER LOGIN <login_name> WITH PASSWORD = '<enterStrongPasswordHere>';
重要
いずれのログインでも、固有のパスワードを変更できます。
ALTER ANY LOGIN
権限を持つログインだけが、他のユーザーのログイン パスワードを変更できます。 ただし、 sysadmin ロール メンバーのパスワードを変更できるのは、 sysadmin ロールのメンバーだけです。
関連コンテンツ
- CREATE LOGIN (Transact-SQL)
- ALTER USER (Transact-SQL)
- ユーザーを作成 (Transact-SQL)
- sys.database_principals (Transact-SQL)
- sys.server_principals (Transact-SQL)
- sp_change_users_login (Transact-SQL)
- sp_addlogin (Transact-SQL)
- sp_grantlogin (Transact-SQL)
- sp_password (Transact-SQL)
- sys.sysusers (Transact-SQL)
- sys.sql_logins (Transact-SQL)
- sys.syslogins (Transact-SQL)