web-dev-qa-db-ja.com

データベースを復元すると、そのデータベース内のオブジェクトをターゲットとする外部の同義語が壊れますか?

別のデータベースのシノニムがそのデータベースのオブジェクトを参照するデータベースがある場合、そのデータベースにバックアップを復元するとシノニムは無効になりますか?

具体的には、次の状況を想像してみてください。

  • SQL 2008 R2サーバー上のデータベースSynonym_Targには、いくつかのデータベースオブジェクトが含まれています。 dbo.fooというテーブル
  • データベースSynonym_Homeには、データベースSynomym_Targのテーブルdbo.fooを参照するシノニムdbo.fooがあります。
  • 通常Synonym_Targに常駐するデータベースのバックアップがそこに復元されます。これにはオブジェクトdbo.fooが含まれています。

このプロセスがSynonym_Hostのdbo.fooシノニムを無効にすることを期待する必要がありますか?

このプロセスでシノニムが無効になることはありません。 the docs に従って:

シノニムとその基本オブジェクト間のバインディングは名前のみによるものです。基本オブジェクトの存在、タイプ、および権限のチェックはすべて、実行時まで延期されます。したがって、基本オブジェクトを変更、削除、または削除して、元の基本オブジェクトと同じ名前を持つ別のオブジェクトに置き換えることができます。

この動作は次の方法でテストできます。

use [master]
go
drop database if exists Synonym_Targ, Synonym_Home
go
create database Synonym_Targ
create database Synonym_Home
go
alter authorization on database ::Synonym_Targ to sa
alter authorization on database ::Synonym_Home to sa
go
use Synonym_Targ
go
create table dbo.foo ( i int default 1);
go
insert dbo.foo default values
go
use Synonym_Home
go 
create synonym dbo.foo for Synonym_Targ.dbo.foo
go
create or alter proc p 
as 
select * from dbo.foo
go
exec p
go
backup database Synonym_Targ to disk = 'c:\temp\Synonym_Targ.bak'
go
drop database Synonym_Targ
go
exec p
/*
Msg 5313, Level 16, State 1, Procedure p, Line 3 [Batch Start Line 30]
Synonym 'dbo.foo' refers to an invalid object.
*/
go
restore database Synonym_Targ from disk = 'c:\temp\Synonym_Targ.bak'
go
exec p
go
use [master]
go
drop database if exists Synonym_Targ, Synonym_Home
go
7
Peter Vandivier