SQL Azure - 确定联合哪些表

时间:2013-03-27 16:57:58

标签: sql-server visual-studio-2012 azure-sql-database federated-table

我是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语句,它运行得非常好!!

所以,显然发生了一些事情,使我的桌子不再“联合”了。最后,我的问题非常简单:

  • 是否存在可以在根数据库上运行的查询,也可能是在 联盟成员告诉我哪些表是联合的,哪些是联合的 都没有?
  • 此外,任何人都可以告诉我为什么我曾经联合的表 还没联邦?因为很明显,我可能会进行架构更改 在遥远的未来,并不能只是放弃桌子和 重新开始,所以知道我做错了会很高兴。

2 个答案:

答案 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但不太方便。