2

Я новичок в SQL Azure и на ранних этапах разработки приложения, поэтому моя схема часто меняется. Я начал с создания корневой базы данных и выполнения запросов к ним, как эти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 и правой кнопкой мыши на таблице и выбрав «View Code», который делает что-то вроде этого:

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 [email protected]", p); // p has the parameters 

, но тогда я получаю следующее сообщение об ошибке:

DML statements are not supported on non-federated tables in a filtered connection. 

ВТУ? Помните, моя таблица объединена. Кроме того, аналогичный код отлично работал с другими таблицами. Странная вещь о Stuff заключается в том, что ее схема недавно изменила LOT, поэтому мне кажется, что, может быть, я подключаюсь к члену федерации непосредственно в VS2012, и внесение изменений там каким-то образом не сделало его не объединенной таблицей (есть 3 типа таблиц в объединенная база данных: http://convective.wordpress.com/2012/03/05/introduction-to-sql-azure-federations/).

Итак, поскольку я нахожусь в разработке, в Stuff действительно нет ничего важного, поэтому я пошел дальше и скопировал его код CREATE TABLE и полностью отбросил его из этого члена, вернулся в корневую базу данных и повторно - выполнил приведенный выше код наверху с оператором FEDERATED ON (ClientId=cid), а затем повторно запустил инструкцию insert из моего приложения, и это сработало чудесно!

Так что, очевидно, что-то случилось, чтобы мой стол не был «объединен». В конце концов, мои вопросы довольно просты:

  • Есть запрос, который я могу работать на корневой базе данных или, может быть, на члене федерации, чтобы сказать мне, какие таблицы являются федеративными и которые не являются?
  • Кроме того, может ли кто-нибудь сказать мне, почему мой одноранговый стол больше не объединен? Потому что, очевидно, я могу внести изменения схемы в далеком будущем и не смогу просто отбросить стол, а начнется, так что было бы неплохо узнать, что я делаю неправильно.
+0

Очень хороший вопрос. Именно тот, который я собирался спросить :) +1. – JYL

ответ

1

1 вы можете посмотреть sys.federated_table_columns, чтобы указать, какие таблицы объединены в члены.

2 Мое предположение: вы теряете свойство, потому что VS воссоздает таблицы без федеративного предложения.к сожалению, vs не полностью интегрирован в SQLazure, поэтому вам нужно следить за этими сценариями. в противном случае нет причин потерять или изменить федеративное свойство таблицы. вы можете изменить все другие свойства в объединенной таблице, например, разработать свою схему и т. д., но вы либо создаете федерацию таблицы, и она остается таким образом, либо вы создаете ее в качестве справочной таблицы, и она остается такой.

Надеется, что это помогает

+0

Спасибо, Cihan! Итак, если я избегу редактирования в VS, что такое синтаксис T-SQL для изменения объединенных таблиц? Это просто нормальный оператор ALTER, когда я подключен к члену федерации или подключаюсь к корню? Есть ли какой-нибудь GUI, который может помочь? Я попробовал портал управления SQL (silverlight), но он, похоже, не работает для меня в Chrome ... – Jorin

1

Tsql Вашего самой безопасным варианту для редактирования схемы. Просто используйте добрую старую таблицу alter на поданных столах. Ничего особенного. Схема не разделяется между корнем и членами, поэтому все объекты схемы являются локальными для db. Поэтому отредактируйте создание/редактирование объектов там, где они вам нужны, root или members. По мере разделения вы создаете больше членов, и система будет клонировать схемы и правильно перемещать данные и т. Д., Но после того, как раскол будет выполнен, каждый член будет независим от изменений схемы снова ... Таким образом, для всех практических целей это отдельные dbs, которые просто сгруппированы. для инструментов, порталов или ssms. Любой редактор tsql работает до тех пор, пока вы не забудете использовать USE FED для навигации по туровому соединению с правым db перед действием на члена. Вы также можете использовать имена db для подключения к членам и пропускать использование, но менее удобно.