3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(SQL Server)mdfファイルを別SQL Serverに移行した時のDBユーザの問題

例えば、SQL Server で "testDB" というデータベースを運用しているとします。

この SQL Server には "userA" という SQL ユーザがおり、SQL 認証でのログインが可能で、"testDB" に対して db_owner のロールを持っているとします。

この "testDB" データベースをデタッチして、新たに SQL Server をインストールした別のサーバに "testDB" の mdf,ldf ファイルを移してアタッチします。

この時、どうやら mdf ファイルに前のサーバで設定した データベースユーザの情報が残っているらしく、Management Studio でみると、"testDB" のセキュリティに "userA" が表示されます。

ただ、SQL Server 全体のセキュリティには表示されません。

ちょうど下記のような状態です。(SQL Server からユーザ削除した時と同じ現象ですね。)

これは "testDB" の "userA" のプロパティです。ログインができなくなってます。

この状態で、下記のように "userA" を作っても、うまく "testDB" とのマッピングができません。

USE [master]

GO

CREATE LOGIN userA WITH PASSWORD=N'1234', DEFAULT_DATABASE=testDB, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE testDB

GO

CREATE USER userA FOR LOGIN userA

GO

USE testDB

GO

EXEC sp_addrolemember N'db_owner', N'userA'

GO

このように、マッピングされていない状態となってしまいます。

それで、上記のコマンドの前にいったん "testDB" に関連付けられてる "userA" を削除する下記 SQL を実行したら、上記コマンド実行後にちゃんと "testDB" と "userA" がマッピングされるようになりました。

USE [testDB]

GO

DROP USER [userA]

GO

まあ、Management Studio から手動でマッピングしてもいいんですが、パッケージ製品として、インストール時にバッチファイル等で初期設定するときとかは SQL コマンドでやったほうが楽ですね。