Как настроить отслеживание изменений в проекте базы данных Visual Studio (SSDT)

У меня есть проект базы данных SQL Server 2005, и я хочу развернуть схему поверх существующей базы данных, которая находится в более поздней версии SQL Server. У меня проблема в том, что отслеживание изменений включено в БД, которую я хочу развернуть, и поэтому первое, что хочет сделать SSDT, это отключить CT. Это создает проблему, поскольку я получаю сообщение об ошибке ниже:

(43,1): SQL72014: поставщик данных .Net SqlClient: сообщение 22115, уровень 16, состояние 1, строка 5. Отслеживание изменений включено для одной или нескольких таблиц в базе данных «Тест». Отключите отслеживание изменений для каждой таблицы, прежде чем отключать его для базы данных. Используйте представление каталога sys.change_tracking_tables, чтобы получить список таблиц, для которых включено отслеживание изменений. (39,0): SQL72045: ошибка выполнения скрипта. Исполняемый скрипт:

IF EXISTS (SELECT 1
       FROM   [master].[dbo].[sysdatabases]
       WHERE  [name] = N'$(DatabaseName)')
BEGIN
    ALTER DATABASE [$(DatabaseName)]
        SET CHANGE_TRACKING = OFF 
        WITH ROLLBACK IMMEDIATE;
END

Чтобы обойти это, я создал сценарий PreDeployment, который выполняет следующее:

/* Run pre-deployment scripts to resolve issues */
IF(SELECT SUBSTRING(@@VERSION, 29,4)) = '11.0'

BEGIN

PRINT 'Enabling Change Tracking';

DECLARE @dbname VARCHAR(250)
SELECT @dbname = DB_NAME()

EXEC('
        IF NOT EXISTS(SELECT * FROM [master].[dbo].[sysdatabases] WHERE name = ''' + @dbname + ''')
        
        ALTER DATABASE ['+ @dbname +
        ']SET CHANGE_TRACKING = ON
        (CHANGE_RETENTION = 5 DAYS, AUTO_CLEANUP = ON);
');

EXEC('
IF NOT EXISTS(SELECT * FROM sys.change_tracking_tables ctt
          INNER JOIN sys.tables t ON t.object_id = ctt.object_id
          INNER JOIN sys.schemas s ON s.schema_id = t.schema_id
          WHERE t.name = ''TableName'')
BEGIN
    ALTER TABLE [dbo].[TableName] ENABLE CHANGE_TRACKING;
END;');

Таким образом, на основе отслеживания изменений версии БД включено отслеживание изменений в БД и соответствующих таблицах, если предположить, что оно еще не включено. Я получил эту идею из предыдущего сообщения: # условная компиляция типа ifdef в T-SQL sql server 2008 2005

К сожалению, это все еще не работает, так как SSDT пытается отключить отслеживание изменений до выполнения сценария PreDeployment.


person SQuirellingAlong    schedule 02.12.2015    source источник


Ответы (2)


Убедитесь, что в вашем проекте базы данных включено отслеживание изменений.

Откройте свойства проекта вашей базы данных> Настройки проекта> Настройки базы данных...> вкладка «Операция»> установите флажок «Отслеживание изменений».

person Keith    schedule 02.12.2015
comment
Да, это было бы простое решение, но поскольку проект 2005 года, этот вариант не указан. В идеале я бы перевел проект на 2012 год и выполнил ваше предложение. К сожалению, в обозримом будущем проект должен остаться в 2005 году. - person SQuirellingAlong; 03.12.2015

Как сказал Кит, если вы хотите, включите его. Если вы хотите отключить его, просто запустите свой скрипт перед сравнением, чтобы у вас был сценарий перед развертыванием, например:

https://the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT

Если вы отключаете его, то это довольно просто.

Другие варианты — написать свой собственный деплоймент и вызвать ошибку через соединение.

Участник развертывания:

https://the.agilesql.club/blog/Ed-Elliott/2015/09/23/Inside-A-SSDT-Deployment-Contributor

https://github.com/DacFxDeploymentContributors/Contributors

Ed

person Ed Elliott    schedule 03.12.2015
comment
Это выглядит полезно для чтения и похоже на то, что я начал пытаться использовать в сценариях Octopus PreDeployment. Тем не менее, наличие этого ранее в конвейере CI сделало бы жизнь проще, не говоря уже о безопасности, поэтому я рассмотрю пост более подробно и попытаюсь воспроизвести. - person SQuirellingAlong; 03.12.2015