Репликация транзакций 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, добавив представление noexpanding после создания индекса.
Я думаю, что нашел более простой способ.
При добавлении индексированного представления к репликации с использованием графического интерфейса, копирование будет выполняться только через определение схемы, что означает, что любые сохраненные процессы, пытающиеся получить доступ к этим представлениям, будут иметь ошибку, если они содержат подсказку NOEXPAND.
Теперь, я думаю, вы можете возиться со скриптами pre/post, но, используя эту статью из MSDN: Indexed Views - Replications - NoExpand Hint, вариант кажется более простым.
Вы можете реплицировать индексы, изменив скрипт для sp_addarticle и заменив @schema_option с 0x0000000008000001 на 0x0000000008000051. В следующем примере разрешается создание кластерного и некластеризованного индекса на подписчике.
Это автоматически перетаскивает индексы и означает меньше сценариев.