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.
- SQLCompare видит, что вы сравниваете папку скрипта с базой данных (в данном случае тест) и появляется новый скрипт миграции
- SQLCompare извлекает информацию о схеме из базы данных развертывания и создает копию этой базы данных в (LocalDB) \ RedGateTemp
- Затем SQLCompare запускает новый сценарий миграции для временной базы данных (LocalDB) \ RedGateTemp
- SQLCompare выясняет, какие изменения и генерирует сценарий миграции, или, если вы используете ключ / sync, развертывает изменения
- Если во время создания временной базы данных в (LocalDB) \ RedGateTemp возникает исключение, тогда вся временная база данных удаляется, но сценарий миграции все еще выполняется.
Чтобы найти ошибку, я запустил SQL Profiler в (LocalDB) \ RedGateTemp, отслеживая события ErrorLog и EventLog из раздела "Ошибки и предупреждения" и SQL:BatchStarting из раздела TSQL. Сделав это, я увидел, что LocalDB выдавал ошибку, когда из тестовой базы данных создавалась табличная функция с командой Contains в полнотекстовом поле. LocalDB не поддерживает эту функцию. К счастью для меня, эта функция не нужна, поэтому я удалил ее. После этого все снова заработало.
Я хотел поделиться тем, как я решил эту проблему, чтобы помочь людям ориентироваться в правильном направлении.