Sql-Server

恢復數據庫是否會破壞針對該數據庫中對象的外部同義詞?

  • March 8, 2019

如果有一個數據庫,其中另一個數據庫中的同義詞引用該數據庫中的對象,那麼將備份還原到該數據庫是否會使同義詞失效?

具體來說,想像一下這種情況:

  • SQL 2008 R2 伺服器上的數據庫 Synonym_Targ 中有一些數據庫對象,例如名為 dbo.foo 的表
  • 數據庫 Synonym_Home 有一個同義詞 dbo.foo,指的是數據庫 Synomym_Targ 中的表 dbo.foo。
  • 通常駐留在 Synonym_Targ 中的數據庫備份將恢復到其中。這包含一個對象 dbo.foo。

是否應該期望此過程使 Synonym_Host 上的 dbo.foo 同義詞無效?

此過程不應使同義詞無效。根據文件

同義詞與其基礎對象之間的綁定僅通過名稱進行。對基礎對象的所有存在、類型和權限檢查都推遲到執行時進行。因此,可以修改、刪除或刪除基礎對象並將其替換為與原始基礎對象同名的另一個對象。

您可以使用以下內容測試此行為。

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

引用自:https://dba.stackexchange.com/questions/231638