SQL Server では、バックアップを取得したサーバー以降のバージョンの SQL Server であれば、異なるサーバー名の環境に対してもデータベースのバックアップをリストアすることができます。
バックアップを取得した環境にリストアする場合は問題ないのですが、他のサーバーにリストアをした際に、データベースの所有者が設定されていない状態になることがありますので、すべてのデータベースに所有者が設定されているかの確認と修正方法を本投稿で記載しておきたいと思います。
所有者が設定されていないデータベースの確認
次のクエリを実行することで、所有者が設定されていないデータベースが存在するかを確認することができます。
DECLARE @t TABLE(database_name sysname, owner varchar(100)) INSERT INTO @t EXEC sp_MSforeachdb 'USE [?];select ''?'' AS database_name, suser_sname((select sid from sys.database_principals where name = N''dbo''));' SELECT * FROM @t
owner が NULL となっているデータベースが所有者が設定されていないデータベースとなります。
所有者が設定されていないデータベースになるケース
データベースをリストアした際に、所有者が設定されていないデータベースとなるケースとしては、データベースの所有者の SID のログインが、リストアをするインスタンスに存在していない場合です。
- ドメインユーザーを使用した Windows 認証のログイン
- SID をバックアップ取得元と揃えて作成した SQL Server 認証のログイン
このようなログインが所有者として設定されている場合、バックアップ取得元 / リストア先でログインの SID が同じとなるため、所有者もそのまま移行されますが、そうでない場合 (ローカルユーザーを使用した Windows 認証 / SID を揃えずに作成した SQL Server 認証のログイン) は、上述のように所有者の項目が NULL となった状態となります。
単純なデータストアとして使用するだけであれば、所有者が設定されていなくても動作する機能が多いと思いますが、一部の機能 (例: レプリケーション) について所有者が設定されていないと次のエラーが発生することがあります。
状態: 0、コード: 15517、テキスト: 'データベース プリンシパルとして実行できません。 プリンシパル "dbo" が存在しないか、こ の種類のプリンシパルで権限を借用できないか、ユーザーに権限がありません。'。
このようなエラーが発生した場合、所有者を再設定する必要があります。
所有者の再設定方法
所有者の再設定については、ALTER AUTHORIZATION を実行します。
具体的には次のようなクエリを実行します。
ALTER AUTHORIZATION ON DATABASE:: <データベース名> to <ログイン>
このクエリを実行することで、データベースの所有者 (dbo) として、指定したログインが設定された状態となります。
このように所有者を再設定することで上述の 15517 のエラーを解消することができます。