恢复数据库是否会破坏针对该数据库中对象的外部同义词?

Con*_*lls 4 sql-server sql-server-2008-r2 restore synonyms

如果一个数据库中另一个数据库中的同义词引用该数据库中的对象,那么将备份恢复到该数据库是否会使同义词失效?

具体来说,想象一下这种情况:

  • SQL 2008 R2 服务器上的数据库 Synonym_Targ 中有一些数据库对象,例如一个名为 dbo.foo 的表
  • 数据库 Synonym_Home 有一个同义词 dbo.foo,指的是数据库 Synonym_Targ 中的表 dbo.foo。
  • 通常驻留在 Synonym_Targ 中的数据库备份将恢复到其中。这包含一个对象 dbo.foo。

是否应该期望此过程使 Synonym_Host 上的 dbo.foo 同义词无效?

Pet*_*ier 7

此过程不应使同义词无效。根据文档

同义词与其基础对象之间的绑定仅通过名称进行。对基础对象的所有存在、类型和权限检查都推迟到运行时进行。因此,可以修改、删除基础对象,或者删除并替换为与原始基础对象同名的另一个对象。

您可以使用以下方法测试此行为。

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
Run Code Online (Sandbox Code Playgroud)