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

Sql server SQL Azure-确定哪些表是联合的,sql-server,visual-studio-2012,azure-sql-database,federated-table,Sql Server,Visual Studio 2012,Azure Sql Database,Federated Table,我是SQLAzure新手,处于开发应用程序的早期阶段,因此我的模式经常变化。我首先创建根数据库并对其执行如下查询 CREATE TABLE [dbo].[Clients] ( [ClientId] UNIQUEIDENTIFIER NOT NULL primary key clustered default newid(), [ClientName] NVARCHAR (MAX) NULL ); go create federation ClientFederat

我是SQLAzure新手,处于开发应用程序的早期阶段,因此我的模式经常变化。我首先创建根数据库并对其执行如下查询

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种表:)

因此,由于我是早期开发人员,
的内容实际上没有什么重要的内容,所以我继续复制了它的CREATE TABLE代码,并将其从该成员中完全删除,返回到根数据库并重新执行上面列出的代码,并启用了
联邦(ClientId=cid)
语句,然后从我的应用程序中重新运行insert语句,效果非常好

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

  • 是否有一个查询可以在根数据库上运行,或者在 联合成员告诉我哪些表是联合的,哪些是联合的 不是吗
  • 还有,有人能告诉我为什么我曾经的联邦表是 不再联合了?因为很明显,我可能会对模式进行更改 在遥远的将来,我们将不能仅仅放下桌子 重新开始,这样知道我做错了什么就好了

1您可以查看
sys.federated\u table\u列
,以确定哪些表在成员中是联合的

2我猜您正在丢失该属性,因为VS正在重新创建没有federated on子句的表。不幸的是,vs并没有完全集成到SQLazure中,所以您需要注意这些场景。否则,就没有理由丢失或更改表的federated on属性。您可以更改联邦表上的所有其他属性,如evolve your schema等。但您可以创建联邦表并保持这种方式,也可以将其创建为引用表并保持这种方式


希望这对您有所帮助

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

谢谢,慈涵!那么,如果我避开在VS中进行编辑,那么用于修改联邦表的T-SQL语法是什么?当我连接到联邦成员时,它只是一个普通的ALTER语句,还是连接到根?是否有任何GUI可以提供帮助?我尝试了SQL管理门户(silverlight),但在Chrome中它似乎对我不起作用……这是一个很好的问题。正是我要问的:)+1。