私は 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)
ステートメントを再度使用して、アプリから挿入ステートメントを再実行すると、うまく機能しました!!
したがって、明らかに何かが起こって、テーブルが「フェデレーション」されなくなりました。最後に、私の質問は非常に単純です。
- ルート データベースまたはフェデレーション メンバーで実行して、フェデレーションされているテーブルとそうでないテーブルを確認できるクエリはありますか?
- また、かつてフェデレートされていたテーブルがもうフェデレートされていない理由を誰か教えてもらえますか? 明らかに、遠い将来にスキーマを変更する可能性があり、テーブルを削除して最初からやり直すことはできないため、何が間違っているのかを知っておくとよいでしょう。