RedGate Migrations V2 Beta продолжает получать неверное имя объекта [TableName]

В настоящее время я оцениваю использование RedGate SQL Source Control и SQLCompare для нашей инициативы непрерывной интеграции. Начиная все прошло очень гладко, было легко добавлять / удалять таблицы, добавлять пустые столбцы, удалять столбцы и так далее без каких-либо проблем. Пока я не начал изучать сценарии миграции. Простым примером, который я пробовал, было создание столбца, который можно обнулять.

Наш процесс: внесение изменений в общую разработку SQL Server -> изменение проверяется в системе контроля версий -> развертывание в тестовой среде путем сравнения системы контроля версий с тестовой базой данных.

Настроить:

  • Контрольисточника: GIT
  • Модель: Shared - все разработчики работают на одной базе данных
  • Временная база данных: LocalDB - разработчики не имеют возможности создавать базы данных на серверах
  • Используйте источник, контролируемый как "центр правды", потому что кто-то может быть в середине изменений на Сервере разработки. Непреднамеренные / незаконченные изменения могут быть отправлены вверх.

Пример сценария миграции:

DECLARE @ShouldRunMigrationScript BIT
SET @ShouldRunMigrationScript = 1
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns WHERE TABLE_SCHEMA = 'dbo' AND table_name='Test' AND COLUMN_NAME = 'testColumn' AND IS_NULLABLE = 'No')
BEGIN
    SET @ShouldRunMigrationScript = 0;
    PRINT 'Column [testColumn] in [dbo].[Test] is already not nullable - skipping migration';   
END
IF @ShouldRunMigrationScript = 1
BEGIN        
     UPDATE [dbo].[Test] SET testColumn = anotherTestColumn WHERE TestColumn IS NULL;
     ALTER TABLE [dbo].[Test] ALTER COLUMN [testColumn] VARCHAR(500) NOT NULL;    
END

Я запускаю SQL Compare из командной строки:

"C:\Program Files (x86)\Red Gate\SQL Compare 10\sqlcompare" /scripts1:"[Folder where SQL Source Control Saves]"  /Server2:[Test SQL Server] /Database2:[Test Database] /scriptfile:"c:\Migrations.txt" /f /Options:Defaults,UseMigrationsV2

Это выдает мне ошибку "Ошибка при запуске сценария миграции: неверное имя объекта" dbo.Test ".

Серверы разработки и тестирования SQL имеют dbo.Test. Я не опускаю столбец или таблицу ни в одном из моих сценариев. Кто-нибудь знает, почему это произойдет?

1 ответ

Решение

Я прочитал документацию о том, как работает V2 Migrations, предоставленную RedGate (см. Здесь), но это не помогло так сильно, как я надеюсь. Я также обнаружил сообщение на форуме группы Google, где человек сталкивался с подобной проблемой. В этом посте RedGate говорится, что при использовании LocalDB в качестве временного сервера базы данных создаются в экземпляре (LocalDB)\RedGateTemp. Важно отметить, что Migrations V2 все еще находится в бета-версии, поэтому это может измениться.

Я знаю, что localDB установлен, потому что я запустил этот sqlLocalDb Команда из командной строки, и не было выдано никакой ошибки. Я также смог подключиться к (localDb)\RedGateTemp через Sql Server Management Studio, так что все работало нормально. После небольшой проб и ошибок мне удалось выяснить, что происходит с V2 Migrations.

  1. SQLCompare видит, что вы сравниваете папку скрипта с базой данных (в данном случае тест) и появляется новый скрипт миграции
  2. SQLCompare извлекает информацию о схеме из базы данных развертывания и создает копию этой базы данных в (LocalDB) \ RedGateTemp
  3. Затем SQLCompare запускает новый сценарий миграции для временной базы данных (LocalDB) \ RedGateTemp
  4. SQLCompare выясняет, какие изменения и генерирует сценарий миграции, или, если вы используете ключ / sync, развертывает изменения
  5. Если во время создания временной базы данных в (LocalDB) \ RedGateTemp возникает исключение, тогда вся временная база данных удаляется, но сценарий миграции все еще выполняется.

Чтобы найти ошибку, я запустил SQL Profiler в (LocalDB) \ RedGateTemp, отслеживая события ErrorLog и EventLog из раздела "Ошибки и предупреждения" и SQL:BatchStarting из раздела TSQL. Сделав это, я увидел, что LocalDB выдавал ошибку, когда из тестовой базы данных создавалась табличная функция с командой Contains в полнотекстовом поле. LocalDB не поддерживает эту функцию. К счастью для меня, эта функция не нужна, поэтому я удалил ее. После этого все снова заработало.

Я хотел поделиться тем, как я решил эту проблему, чтобы помочь людям ориентироваться в правильном направлении.

Другие вопросы по тегам