sql-server - SQL Azure - 确定哪些表是联合的

标签 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"));

然后使用简洁的:

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) 语句重新执行上面在顶部列出的代码,然后从我的数据库重新运行插入语句应用程序,效果非常好!!

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

  • 是否有一个查询可以在根数据库或在 联合成员告诉我哪些表是联合的以及哪些表是联合的 不是吗?
  • 另外,谁能告诉我为什么我曾经联合过的表现在 不再联合了吗?因为显然,我可能会更改架构 在遥远的将来,将无法直接扔掉 table 并 重新开始,所以很高兴知道我做错了什么。

最佳答案

1 你可以看看sys.federated_table_columns告诉哪些表在成员中联合。

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

希望这有帮助

关于sql-server - SQL Azure - 确定哪些表是联合的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15664776/

相关文章:

java - 我无法连接 SQL Server ClassNotFoundException

sql-server - 错误 = [Microsoft][SQL Server 的 ODBC 驱动程序 11]警告 : BCP import with a format file will convert empty strings in delimited columns to NULL

c# - 在关系数据库中保持实体顺序的最佳模式是什么?

c++ - 是否可以在 Visual Studio 2012 中配置性能 session 文件 (VSP) 的位置?

javascript - 如何使用 JQuery 或 JavaScript 检索 sharepoint 2013 列表数据并填充 DropDownList?

azure - 如何使用 Azure SQL Server 数据库设置 SSRS

sql-server - 弹性查询 - SSL 错误

SQL Server : most commonly used data types?

c# - 是否有将当前类型和成员复制到剪贴板的 Visual Studio 或 Resharper 快捷方式?

asp.net-web-api2 - 最大池大小忽略使用 Azure SQL 和 Azure AppServices