バックアップ後に復元されたユーザー権限->復元操作


11

いくつかのSQL Server 2008データベースを新しいdbサーバーに移動して、それらすべてを(.bakファイルに)バックアップし、これらのファイルを新しいボックスにコピーして復元しました(すべてSQL Management Studioを使用して行いました)。

すべて問題なく動作しましたが、古いRDBMSで引き続き動作するSQL Serverアカウントを使用して、どのデータベースにもログインできません。私のWindows認証ログインは、ついでに問題なく動作します。

ユーザーと権限はすべてシームレスに新しいデータベースサーバーに複製されるという考えがありましたが、どこかで問題が発生しているようです。コメント/提案/ヘルプの提供をお願いします;-)

回答:


7

元の質問で気付いたのは、古いサーバーにまだアクセスできるということでした。

SOに関する次の質問にも同様の問題があり、ユーザーのアクセス許可を生成するスクリプトを含むMicrosoftの記事へのリンクが含まれています。

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(その質問に記載されているリソースhttp://support.microsoft.com/kb/918992

サーバー設定をWindows認証から混合モード認証に変更すると問題が解決したようですが、問題が完全に解決しない場合に備えて、これが役立つと思いました。


ユーザー/権限を超えてSQL Serverを使用するのはこれが初めてではないので、後世のために記事をブックマークします。投稿いただきありがとうございます。
5arx

6

これは「孤立したユーザー」と呼ばれます。これを修正する方法は2つあります

  1. 可能であれば、元のマスターデータベースを「loginsource」として復元します。sys.server_principalsには、すべてのSQL ServerおよびWindowsログインを生成するのに十分な情報があります。つまり、SIDと暗号化されたパスワード

  2. Windowsログインのみを使用する場合は、データベースごとにこれを実行してスクリプトを生成できます。

脚本:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

ご回答ありがとうございます。私のWebアプリはSQLログインを使用していますが、Windowsアカウントは管理目的で使用されています。あなたが提案するように「ログインソース」として復元する方法を見ることができません-詳細を教えていただけますか?私はよ期待して、これはすべての経営管理論Studioを使用して行うことができますか?
5arx

PS。私はこのドキュメントをフォローしました:support.microsoft.com/kb/274188 とすべてのスクリプトを(どうやら)正常に実行しました。しかし、何も変わっていません。
5arx 2011年

5

理想的には、復元を実行する前に、ユーザーと権限をスクリプト化します。それが行われていない場合は、事後に問題を修正する必要があります。チャンスは見逃される可能性がありますが、その方法の約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の下位互換性を持つように作成されています。


スクリプトをありがとう。Management Studioでこれを行う方法がないと思いますか?また、一部の人々は、私がDBレベルのユーザーを削除して再作成することを提案しています-これはお勧めですか?
5arx 2011年

これは、ログインがすでに存在し、SIDのみが一致していることを前提としています
gbn

sp_change_users_loginはSIDを更新しませんか?msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar 2011年

5arx-SSMSでこれを行う方法はありません。私が言ったように、理想的な状況では、復元の前にアクセス許可をスクリプト化することになります。この時点で、手動で再作成するか、自分で手動でつなぎ合わせる必要があります。私があなただったら、古いdbを復元し、権限をスクリプト化し、他のサーバーから復元してから、権限をやり直します。
SQLRockstar 2011年

「Update_One:現在のデータベースで指定されたユーザーを既存のSQL Serverログインにリンクします。ユーザーとログインを指定する必要があります。パスワードはNULLか指定しないでください。」そのため、ログインがすでに存在すると想定しています。
gbn 2011年


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.