2

私は 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フェデレーション内の多くの同様のテーブルの 1 つにすぎません (本名でもありません)。

さて、私が言ったように、私のスキーマは非常に頻繁に変更されるので、スキーマを変更するには、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)ステートメントを再度使用して、アプリから挿入ステートメントを再実行すると、うまく機能しました!!

したがって、明らかに何かが起こって、テーブルが「フェデレーション」されなくなりました。最後に、私の質問は非常に単純です。

  • ルート データベースまたはフェデレーション メンバーで実行して、フェデレーションされているテーブルとそうでないテーブルを確認できるクエリはありますか?
  • また、かつてフェデレートされていたテーブルがもうフェデレートされていない理由を誰か教えてもらえますか? 明らかに、遠い将来にスキーマを変更する可能性があり、テーブルを削除して最初からやり直すことはできないため、何が間違っているのかを知っておくとよいでしょう。
4

2 に答える 2

1

1 you can look at sys.federated_table_columns to tell which tables are federated in members.

2 my guess is you are losing the property because VS is recreating the tables without the federated on clause. unfortunately, vs is not integrated fully into SQLazure so yo need to watch out for these scenarios. otherwise, there is no reason to lose or change the federated on property of a table. you can change all other properties on a federated table like evolve your schema etc. but you either create the table federated and it stays that way or you create it as a reference table and it stays that way.

Hope this helps

于 2013-03-28T06:45:42.937 に答える
1

Tsql は、スキーマを編集するための最も安全なオプションです。フィードされたテーブルで古き良き変更テーブルを使用するだけです。特にない。スキーマはルートとメンバー間で共有されないため、すべてのスキーマ オブジェクトはデータベースに対してローカルです。したがって、必要な場所、ルートまたはメンバーの作成/編集オブジェクトを編集します。分割すると、より多くのメンバーが作成され、システムはスキーマのクローンを作成し、データなどを正しく移動しますが、分割が完了すると、各メンバーはスキーマの変更から再び独立します...したがって、すべての実用的な目的のために、これらは個別のデータベースです単にグループ化されています。ツール、ポータル、または ssms の場合。メンバーに対するアクションの前に、USE FED を使用してツアー接続を適切なデータベースにナビゲートすることを忘れない限り、どの tsql エディターも機能します。db 名を使用してメンバーに接続し、fed の使用をスキップすることもできますが、あまり便利ではありません。

于 2013-03-28T14:52:30.697 に答える