1

我们有一个 Windows Azure 联合数据库,我们需要将其转换为普通数据库(由于联合即将停用)。

阅读了大量文档并尝试了各种方法后,答案似乎是 ALTER FEDERATION ... SWITCH OUT AT 命令:-

https://msdn.microsoft.com/library/dn269988.aspx

从联合成员数据库中删除所有联合元数据和约束。执行后,联合成员是一个独立的数据库。

该命令的格式如下:-

ALTER FEDERATION federation_name SWITCH OUT AT ([LOW | HIGH] distribution_name = boundary_value)

LOW 或 HIGH 确定将在给定联合边界值的相应侧切换出的联合成员。边界值必须对应于现有联合中的现有分区值 range-high 或 range-low。

并且有一个具体的例子来切换边界为 99 的联邦:-

ALTER FEDERATION CustomerFederation SWITCH OUT AT (LOW cid = 100)

因此,利用上述所有信息,我查询了联邦值,它返回以下内容:-

SELECT * FROM sys.federations  
federation_id : 65536  
name : CustomerFederation  

SELECT * FROM sys.federation_members  
federation_id : 65536  
member_id : 65536  

SELECT * FROM sys.federation_distributions  
federation_id : 65536  
distribution_name : cid  
distribution_type : RANGE  
system_type_id : 127  
max_length : 8  
precision : 19  
scale : 0  
collation_name : NULL  
user_type_id : 127  
boundary_value_in_high : 1  

SELECT * FROM sys.federation_member_distributions  
federation_id : 65536  
member_id : 65536  
distribution_name : cid  
range_low : -9223372036854775808  
range_high : NULL  

但是,无论我尝试为边界值使用什么值,我都会得到以下信息:-

Msg 45026, Level 16, State 1, Line 1  
ALTER FEDERATION SWITCH operation failed. Specified boundary value does not exist for federation distribution cid and federation CustomerFederation.

我试过使用 range_low 值:-

ALTER FEDERATION CustomerFederation SWITCH OUT AT (LOW cid = -9223372036854775808)  
ALTER FEDERATION CustomerFederation SWITCH OUT AT (HIGH cid = -9223372036854775808)  

我也尝试了该值的任一侧,因为示例使用 100 来 SWITCH OUT 99

我尝试使用 0,因为这是我用来连接到联邦的值,但是对于 LOW 和 HIGH,它会产生相同的错误,就像 -1 和 1 一样。

我还尝试在运行命令之前指定使用联合根:-

USE FEDERATION ROOT WITH RESET  
GO

ALTER FEDERATION CustomerFederation SWITCH OUT AT (LOW cid = -9223372036854775808)

我尝试从主数据库和联邦运行它。

有没有人成功地使用了 ALTER FEDERATION ... SWITCH OUT AT 命令并且可以指出我正确的方向吗?

4

1 回答 1

2

在四处寻找之后,我找到了一个联邦迁移实用程序的链接:

https://code.msdn.microsoft.com/vstudio/Federations-Migration-ce61e9c1

查看代码,似乎正确的命令是我已经尝试过的:

ALTER FEDERATION CustomerFederation SWITCH OUT AT (HIGH cid = -9223372036854775808)

这次奏效了。不知道为什么它不是第一次,可能是我在它扔掉之前尝试过的其他东西。

于 2015-07-09T08:16:13.827 回答