我是 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)
语句,然后从我的应用程序重新运行插入语句,它工作得非常好!
因此,显然发生了一些事情,使我的表不再“联合”。最后我的问题很简单:
- 是否有可以在根数据库或联合成员上运行的查询来告诉我哪些表是联合的,哪些不是?
- 另外,谁能告诉我为什么我曾经联合的表不再联合?因为很明显,我可能会在遥远的将来进行架构更改,并且不能只是删除表并重新开始,所以很高兴知道我做错了什么。