我是SQL Azure的新手,在开发应用程序的早期阶段,所以我的架构经常变化。我开始创建根数据库并对其执行查询,如这些
CREATE TABLE [dbo].[Clients] (
[ClientId] UNIQUEIDENTIFIER NOT NULL primary key clustered default newid(),
[ClientName] NVARCHAR (MAX) NULL
);
go
create federation ClientFederation(cid uniqueidentifier range)
go
use federation ClientFederation(cid='00000000-0000-0000-0000-000000000000') WITH RESET, FILTERING=OFF
go
CREATE TABLE [dbo].[Stuff] (
[StuffId] uniqueidentifier not null default newid(),
[ClientId] UNIQUEIDENTIFIER NOT NULL default federation_filtering_value('cid'),
[StuffName] NVARCHAR (50) NOT NULL,
-- bunch (20+) of other fields
primary key clustered (StuffId, ClientId ASC)
) FEDERATED ON (cid=ClientId);
在大多数情况下,效果非常好。 Stuff
只是联邦中许多类似表中的一个表(而不是真实姓名)
那么,就像我说的那样,我的架构经常发生变化,所以要更改架构,我要连接到VS2012中的联盟成员,右键单击表并选择“查看代码”,它会呈现类似的东西。这样:
CREATE TABLE [dbo].[Stuff] (
[StuffId] uniqueidentifier not null default newid(),
[ClientId] UNIQUEIDENTIFIER NOT NULL default federation_filtering_value('cid'),
[StuffName] NVARCHAR (50) NOT NULL,
-- bunch (20+) of other fields
primary key clustered (StuffId, ClientId ASC)
)
请注意,唯一不同的是,在密切括号后,它不再显示FEDERATED ON (cid=ClientId);
。我认为这是因为我已经连接到特定的联盟成员,所以它已经知道了这些信息。奇怪的是当我试图对它运行一些.net代码时。我将从我的应用程序执行以下代码:
cn.Execute(string.Format("USE FEDERATION {0}({1}='{2}') WITH RESET, FILTERING={3}", federationName, distributionName, key, filtered ? "ON" : "OFF"));
然后使用dapper:
cn.Query("INSERT Stuff(StuffId, StuffName) VALUES (@StuffId, @stuffName); SELECT * FROM Stuff WHERE StuffId=@stuffId", p); // p has the parameters
但后来我收到以下错误消息:
DML statements are not supported on non-federated tables in a filtered connection.
WUT?我的桌子是联邦的,还记得吗?此外,类似的代码与其他表格相得益彰。关于Stuff
的奇怪之处在于它的架构最近改变了很多,所以在我看来,好像我直接在VS2012中连接到联盟成员并在那里进行更改使得它不再是联合表(有3个)联合数据库中的表类型:http://convective.wordpress.com/2012/03/05/introduction-to-sql-azure-federations/)。
所以,由于我处于开发的早期阶段,Stuff
中确实没有任何重要内容所以我继续复制其CREATE TABLE代码并将其完全从该成员中删除,然后返回到根目录数据库并再次使用FEDERATED ON (ClientId=cid)
语句在顶部的中重新执行上面列出的代码,然后从我的应用程序重新运行insert语句,它运行得非常好!!
所以,显然发生了一些事情,使我的桌子不再“联合”了。最后,我的问题非常简单:
答案 0 :(得分:1)
1您可以查看sys.federated_table_columns
以告知哪些表在成员中联合。
2我的猜测是你丢失了属性,因为VS正在重新创建没有federated on子句的表。不幸的是,vs没有完全集成到SQLazure中,所以你需要注意这些场景。否则,没有理由丢失或更改表的联属属性。您可以更改联合表上的所有其他属性,例如演化您的架构等,但是您要么创建联合表并保持这种方式,要么将其创建为引用表并保持这种状态。
希望这有帮助
答案 1 :(得分:1)
Tsql是编辑架构最安全的选项。只需在付费表上使用好的旧表。没什么特别的。根和成员之间不以任何方式共享模式,因此所有模式对象都是db的本地对象。因此,编辑创建/编辑您需要它们的对象,根或成员。当您拆分时,您正在创建更多成员,系统将克隆模式并正确移动数据等但是,一旦拆分完成,每个成员再次独立于模式更改...所以对于所有实际目的,这些是单独的dbs,只是组合在一起。 for Tools,portal或ssms的工作原理。任何tsql编辑器都可以工作,只要你记得在对成员采取行动之前使用USE FED来导航到正确数据库的游览连接。您还可以使用数据库名称连接到成员并跳过使用fed但不太方便。