【发布时间】:2013-03-17 21:12:45
【问题描述】:
我是 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.
哇?我的表是联合的,记得吗?此外,类似的代码在其他表中也能很好地工作。 Stuff 的奇怪之处在于它的架构最近发生了很多变化,所以在我看来,我可能直接在 VS2012 中连接到联合成员并在那里进行更改以某种方式使其不再是联合表(有 3 种类型联合数据库中的表:http://convective.wordpress.com/2012/03/05/introduction-to-sql-azure-federations/)。
所以,由于我处于开发的早期阶段,Stuff 中确实没有什么重要的东西,所以我继续复制它的 CREATE TABLE 代码并将其从该成员中完全删除,回到根数据库并再次使用FEDERATED ON (ClientId=cid) 语句重新执行上面列出的代码,然后从我的应用程序中重新运行插入语句,它工作得非常好!!
所以,显然发生了一些事情,使我的表不再“联合”。最后我的问题很简单:
- 是否有可以在根数据库上运行的查询,或者可能在 联合成员告诉我哪些表是联合的,哪些表是联合的 不是吗?
- 另外,谁能告诉我为什么我曾经联合的表是 不再联合了?因为很明显,我可能会更改架构 在遥远的未来,将不能只是放下桌子和 重新开始,所以很高兴知道我做错了什么。
【问题讨论】:
-
非常好的问题。正是我要问的那个:) +1。
标签: sql-server visual-studio-2012 azure-sql-database federated-table