Репликация транзакций SQL Server для индексированных представлений

Я выполняю репликацию транзакций для индексированных представлений. У меня есть другие реплицируемые представления, связанные со схемой, которые ссылаются на индексированные представления с помощью подсказки NOEXPAND. Несмотря на то, что я вызываю sp_addarticle для представлений NOEXPANDing после вызова sp_addarticle для индексированных представлений, я получаю сообщение об ошибке:

Hint 'noexpand' on object '...' is invalid.

поскольку SQL Server пытается создать представление NOEXPANDing на целевом сервере перед созданием индекса для индексированного представления.

Есть ли способ заставить SQL Server завершить репликацию индексов индексированных представлений перед запуском на NOEXPANDing представлениях?




Ответы (2)


Загляните в базу данных дистрибьютора, и вы найдете сценарии для предварительной и последующей репликации. Это простые сценарии sql, поэтому вы можете изменять их и вставлять в них все, что вам нравится.

Это означает, что вы можете изменить сценарий pre-repl, чтобы избежать ошибки, и изменить сценарий post-repl, чтобы добавить нерасширяющееся представление после создания индекса.

person Dave Hilditch    schedule 11.09.2012
comment
По сути, это то, что я делаю (это все программно) ... Я удаляю оскорбительные NOEXPAND, делаю снимок, жду завершения снимка, затем запускаю ALTER VIEW, чтобы вернуть NOEXPAND, и позволяю репликации SQL обрабатывать репликацию DDL изменить ... но это головная боль ... и я бы предпочел что-нибудь попроще. - person Jeff; 12.09.2012
comment
Вы можете автоматизировать это, изменив свою публикацию - вы можете добавить туда сценарии до и после ответа и фактически изменить сценарии оттуда. Я делал нечто подобное в прошлом, чтобы лучше контролировать создание индекса на подписчике. - person Dave Hilditch; 12.09.2012

Думаю, я нашел способ попроще.

При добавлении индексированного представления к репликации с использованием графического интерфейса будет копироваться только определение схемы, что означает, что любые хранимые процедуры, которые пытаются получить доступ к этим представлениям, будут ошибаться, если они содержат подсказку NOEXPAND.

Теперь я думаю, вы можете повозиться со сценариями до и после публикации, но используя эту статью из MSDN: Индексированные представления - Репликации - Подсказка NoExpand кажется вариант попроще.

Вы можете реплицировать индексы, изменив сценарий для sp_addarticle и заменив @schema_option с 0x0000000008000001 на 0x0000000008000051. Следующий пример позволяет создать на подписчике как кластерный, так и некластеризованный индекс.

Это автоматически перемещает индексы и означает меньше сценариев.

person Chris    schedule 18.11.2015