【问题标题】:SQL Azure - Determine which tables are federatedSQL Azure - 确定联合哪些表
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助

    【讨论】:

    • 谢谢慈涵!那么,如果我避免在 VS 中进行编辑,那么用于更改联合表的 T-SQL 语法是什么?当我连接到联合成员或连接到根时,它只是一个普通的 ALTER 语句吗?是否有任何 GUI 可以提供帮助?我尝试了 SQL 管理门户(silverlight),但它在 Chrome 中似乎不适合我......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多