DBサーバーが古くなり、別サーバーへ移行するため、SQLServerのデータベースの
バックアップを別のサーバーにリストアしました。
スクリプトの検証中にデータベースへのアクセスエラーが発生する問題あったので、
その時の原因と対処法をメモとして残しておきたいと思います。
事象
「BACKUP DATABASE」コマンドでデータベースへのアクセスに失敗しました。
set AA=HSTEDI
sqlcmd -Q "BACKUP DATABASE [%AA%] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Backup\%AA%.bak' WITH NOFORMAT, INIT, NAME = N'%AA%-完全 データベース バックアップ', SKIP, NOREWIND, NOUNLOAD, STATS = 10" -d master -S localhost,1433 -U ユーザー名 -P パスワード
エラーメッセージ
メッセージ 916、レベル 14、状態 2、サーバー HSTEDI02T\SQLEXPRESS、行 1
現在のセキュリティ コンテキストでは、サーバー プリンシパル “ユーザー名” はデータベース “DB名” にアクセスできません。
メッセージ 3013、レベル 16、状態 1、サーバー HSTEDI02T\SQLEXPRESS、行 1
BACKUP DATABASE が異常終了しています。
原因
データベースユーザーとログインユーザーがマッピングされていない。
名称が同じでも内部的にSIDが異なり不整合な状態になっていることが原因。
対処法
次のSQLを発行してユーザーマッピングを行うことで解消します。
EXEC sp_change_users_login 'Update_One','データベースユーザー名','ログインユーザー名'