2

我是 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"));

然后使用小巧玲珑:

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.

呜?我的表是联合的,记得吗?此外,类似的代码在其他表中也能很好地工作。奇怪的Stuff是它的架构最近发生了很多变化,所以在我看来,也许我直接在 VS2012 中连接到联合成员并在那里进行更改以某种方式使其不再是联合表(有 3 种类型的表联合数据库:http ://convective.wordpress.com/2012/03/05/introduction-to-sql-azure-federations/ )。

因此,由于我处于开发的早期阶段,Stuff因此我继续复制其 CREATE TABLE 代码并将其完全从该成员中删除,返回根数据库并重新执行列出的代码在顶部再次声明FEDERATED ON (ClientId=cid)语句,然后从我的应用程序重新运行插入语句,它工作得非常好!

因此,显然发生了一些事情,使我的表不再“联合”。最后我的问题很简单:

  • 是否有可以在根数据库或联合成员上运行的查询来告诉我哪些表是联合的,哪些不是?
  • 另外,谁能告诉我为什么我曾经联合的表不再联合?因为很明显,我可能会在遥远的将来进行架构更改,并且不能只是删除表并重新开始,所以很高兴知道我做错了什么。
4

2 回答 2

1

1 您可以查看sys.federated_table_columns以了解哪些表在成员中是联合的。

2 我的猜测是您正在丢失该属性,因为 VS 正在重新创建没有 federated on 子句的表。不幸的是,vs 没有完全集成到 SQLazure 中,所以你需要注意这些场景。否则,没有理由丢失或更改表的联合属性。您可以更改联合表上的所有其他属性,例如发展您的模式等,但是您可以创建联合表并保持这种方式,或者将其创建为参考表并保持这种方式。

希望这可以帮助

于 2013-03-28T06:45:42.937 回答
1

Tsql 是编辑模式的最安全选择。只需在喂食的桌子上使用好旧的 alter table。没什么特别的。模式在根和成员之间不以任何方式共享,因此所有模式对象都是数据库的本地对象。因此,在您需要它们、根或成员的地方编辑创建/编辑对象。当您拆分时,您正在创建更多成员,系统将克隆模式并正确移动数据等,但是一旦拆分完成,每个成员都会再次独立于模式更改......因此,出于所有实际目的,这些都是单独的数据库只是被组合在一起。用于工具、门户或 ssms 的作品。只要您记得在对成员进行操作之前使用 USE FED 将游览连接导航到正确的数据库,任何 tsql 编辑器都可以工作。您还可以使用数据库名称连接到成员并跳过使用 fed 但不太方便。

于 2013-03-28T14:52:30.697 回答