これは、ログインとユーザーの違いと、それらが互いにどのように関係するかです。
- ログイン - エンティティが SQL Server インスタンスに接続できるようにするインスタンス レベルのプリンシパル。それらは、その性質上、インスタンス上のデータベースへのアクセスを許可しません。これに対する例外は、sysadmin 権限を持つログインは、sysadmin であるためデータベースを使用できますが、sysadmin レベルの権限があるためです。
- ユーザー - エンティティが SQL Server データベースに接続できるようにするデータベース レベルのプリンシパル。ユーザーは SID を介してログインに関連付けられ、2 つの間の関係が作成され、ログインがインスタンスに接続し、関連付けられたユーザーを使用してデータベースに接続できるようになります。
復元時に SQL 認証ログインとデータベース ユーザーでよく発生するのは、SIDS が同期されていないか、データベース内のユーザーのログインが存在しないため、関係が壊れることです。この関係は、そのログインを使用してデータベースに接続する前に修復する必要があります。SQL Server から見ると、これらのプリンシパルは接続されていないためです。ログインが存在しない場合は、最初に作成してユーザーに関連付ける必要があります。
--Windows login (Active Directory pass through)
CREATE LOGIN [DOMAIN\foo] FROM WINDOWS;
--SQL Authenticated
CREATE LOGIN [foo] WITH PASSWORD='5+r0ngP@55w0rd';
ログインが存在したら、それをユーザーに関連付けます。
ALTER USER [foo] WITH LOGIN=[foo]
データベースのコンテキストで次のクエリを使用して、オーファンを確認できます。
select
dp.name [user_name]
,dp.type_desc [user_type]
,isnull(sp.name,'Orhphaned!') [login_name]
,sp.type_desc [login_type]
from
sys.database_principals dp
left join sys.server_principals sp on (dp.sid = sp.sid)
where
dp.type in ('S','U','G')
and dp.principal_id >4
order by sp.name