У меня есть проект базы данных 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.