記事にした背景
データベースの移行時にCLRとデータベース(SQL Server)について理解が浅く失敗したので備忘録として残す。
CLRとは
CLRとはCommon Language Runtimeの略称であり、共通中間言語(CIL:Common Intermediate Language)形式のプログラムを解釈し、機械語に変換して実行するソフトウェア(動作環境)のことである。
失敗した箇所
データベースの移行を旧環境でデータベースをバックアップし、新環境でリストアした。
リストア自体は上手くいったが、そのあとのCLRの設定で下記エラーが発生した。
master データベースに記録されているデータベース所有者 SID がデータベース 'db' に記録されているデータベース所有者 SID と異なります。ALTER AUTHORIZATION ステートメントを使用してデータベース 'db' の所有者を再設定し、この状態を修正してください。
補足:dbはCLRを設定しようとしていた対象のデータベース名である。
原因
エラーメッセージ通り、データベース所有者SID(Security IDentifier:セキュリティ識別子)と、masterデータベースに記録されているデータベース所有者SIDが異なっていた。
また、こちらが重要なのだが検証環境で実行したときはエラーが発生しなかった。
その理由は検証環境でデータベースをリストアしたときと、本番環境でデータベースをリストアしたときでは違うユーザーでログインしていたためである。
データベースの仕様として、リストアしたデータベースの所有者は『ログインしたユーザー』になるということを知らなかったのである。
解決策
1.データベースの所有者を変更する
例(所有者変更のコード)
alter authorization on database::[db] to [sa]
2.SQLServer認証を使用してmasterデータベースに記録されているデータベース所有者SIDと同じユーザで接続する。その状態でリストアをする。
ひとこと
正直、データベースの認証方法は気にしたことがあまりなかった(セキュリティの設定などは有識者が設定していたため)が、今回の件でユーザとデータベースが思いがけないところで関係していることを知れてよかった。