いくつかのSQL Server 2008データベースを新しいdbサーバーに移動して、すべてを(.bakファイルに)バックアップし、これらのファイルを新しいボックスにコピーして復元しました(すべてSQL Management Studioを使用して行いました)。
すべてうまくいきましたが、古いRDBMSで引き続き動作するSQL Serverアカウントを使用して、どのデータベースにもログインできません。私のWindows認証ログインは、ついでに問題なく動作します。
ユーザーと権限はすべてシームレスに新しいデータベースサーバーに複製されるという考えがありましたが、どこかで問題が発生しているようです。コメント/提案/ヘルプの提供をお願いします;-)
元の質問で気付いたのは、古いサーバーにまだアクセスできるということでした。
SO=に関する次の質問には同様の問題があり、ユーザー権限を生成するためのスクリプトを含むMicrosoftの記事へのリンクが含まれています。
https://stackoverflow.com/questions/461385/restoring-a-backup-to-a-different-server-user-permissions
(その質問にリストされているリソース http://support.Microsoft.com/kb/918992 )
サーバー設定をWindows認証から混合モード認証に変更すると問題が解決したようですが、問題が完全に解決しない場合に備えて、これが役立つと思いました。
これは「孤立したユーザー」と呼ばれます。これを修正する方法は2つあります
可能であれば、元のマスターデータベースを「loginsource」として復元します。sys.server_principalsには、すべてのSQL ServerおよびWindowsログインを生成するのに十分な情報があります。つまり、SIDと暗号化されたパスワード
Windowsログインのみを使用する場合、データベースごとにこれを実行してスクリプトを生成できます。
脚本:
SELECT
'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
sys.database_principals
WHERE
[type] IN ('G', 'U')
理想的には、復元を実行する前に、ユーザーと権限をスクリプト化します。それが行われていない場合は、事後に問題を修正する必要があります。チャンスは見逃される可能性がありますが、その方法の約90%を達成できるはずです。
確認する必要がある最初のことは、同じログインが新しいサーバーに存在するかどうかです。そうでない場合は、新しいサーバーでログインを作成してもよいかどうかを確認する必要があります。それらが作成されるべきだと思い込まないでください。そもそもなぜそれらが存在しなかったのかについては、十分な理由がある可能性があります。次に、sysusersテーブルを掘り下げて、それらを作成します。
次のようなものを実行して、孤立したユーザーを修正できます。
DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name
FROM sysusers
WHERE issqluser = 1
and (sid is not null and sid <> 0x0)
and suser_sname(sid) is null
and name in (select name from master..syslogins)
ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_change_users_login 'update_one', @username, @username
FETCH NEXT FROM fixusers
INTO @username
END CLOSE fixusers
DEALLOCATE fixusers
このコードはSQL2008で機能しますが、SQL2000の下位互換性を持つように作成されています。
次のURLを参照して、データベースユーザーの権限を修正できます。