У меня есть установка LiquiBase, которая очень хорошо работает для сценариев Oracle SQL. Мы переносим логи БД c на сервер Microsoft SQL и обнаружили, что в одном блоке SQL некоторые свойства POM не заменяются Maven. Вот пом. xml установка свойств:
<properties>
<version.mssql-jdbc>7.4.1.jre8</version.mssql-jdbc>
<version.org.liquibase.liquibase-maven-plugin>3.6.2</version.org.liquibase.liquibase-maven-plugin>
<liquibase.url>jdbc:sqlserver://x.x.x.x</liquibase.url>
<!-- liquibase.url>offline:oracle?outputLiquibaseSql=true</liquibase.url -->
<liquibase.execute.goal>update</liquibase.execute.goal>
<liquibase.driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</liquibase.driver>
<admin.db.name>sa</admin.db.name>
<admin.db.password>xxx</admin.db.password>
<custom.db.name>CUSTOM_USERNAME</custom.db.name>
<custom.db.password>CUSTOM_PASSWORD</custom.db.password>
<database.filelocation>D:\\Program Files\\Microsoft SQL Server\\MSSQL14.LAB\\MSSQL\\DATA\\</database.filelocation>
</properties>
Вот база SQL с включенными свойствами:
USE [master];
GO
-- Creating logins
CREATE LOGIN ${custom.db.name} WITH PASSWORD = '${custom.db.password}';
GO
-- Creating users for the logins
CREATE USER ${custom.db.name} FOR LOGIN ${custom.db.name};
GO
-- Granting permissions to the users
GRANT CONNECT TO ${custom.db.name};
GO
GRANT CREATE DATABASE TO ${custom.db.name};
GO
USE [msdb];
GO
-- Procedure for the housekeeping job
CREATE PROCEDURE hk_job_starter_${custom.db.name}
AS
BEGIN
EXEC sp_add_job @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
EXEC sp_add_jobstep @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}',@step_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}_STEP',@subsystem = N'TSQL',@command = N'USE [${custom.db.name}]; EXEC PKG_HOUSEKEEPING.CLEANUP_DAILY;',@retry_attempts = 5,@retry_interval = 5;
DECLARE @start_date VARCHAR(8);
SELECT @start_date = CONVERT(VARCHAR(8), CONVERT(INTEGER, CONVERT(VARCHAR(8), GETDATE(), 112)));
EXEC sp_add_schedule @schedule_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}_SCHEDULE', @freq_type = 4, @freq_interval = 1, @freq_subday_type = 0x8, @freq_subday_interval = 1, @active_start_date = @start_date, @active_start_time = 010000;
EXEC sp_attach_schedule @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}', @schedule_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}_SCHEDULE';
EXEC sp_add_jobserver @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
EXEC sp_start_job @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
END;
GO
CREATE USER ${custom.db.name} FOR LOGIN ${custom.db.name};
GO
GRANT EXECUTE ON hk_job_starter_${custom.db.name} TO ${custom.db.name};
GO
И это то, что получается, когда свойства заменяются на Maven:
USE [master];
GO
-- Creating logins
CREATE LOGIN CUSTOM_USERNAME WITH PASSWORD = 'CUSTOM_PASSWORD';
GO
-- Creating users for the logins
CREATE USER CUSTOM_USERNAME FOR LOGIN CUSTOM_USERNAME;
GO
-- Granting permissions to the users
GRANT CONNECT TO CUSTOM_USERNAME;
GO
GRANT CREATE DATABASE TO CUSTOM_USERNAME;
GO
USE [msdb];
GO
-- Procedure for the housekeeping job
CREATE PROCEDURE hk_job_starter_CUSTOM_USERNAME
AS
BEGIN
EXEC sp_add_job @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
EXEC sp_add_jobstep @job_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME',@step_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME_STEP',@subsystem = N'TSQL',@command = N'USE [CUSTOM_USERNAME]; EXEC PKG_HOUSEKEEPING.CLEANUP_DAILY;',@retry_attempts = 5,@retry_interval = 5;
DECLARE @start_date VARCHAR(8);
SELECT @start_date = CONVERT(VARCHAR(8), CONVERT(INTEGER, CONVERT(VARCHAR(8), GETDATE(), 112)));
EXEC sp_add_schedule @schedule_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME_SCHEDULE', @freq_type = 4, @freq_interval = 1, @freq_subday_type = 0x8, @freq_subday_interval = 1, @active_start_date = @start_date, @active_start_time = 010000;
EXEC sp_attach_schedule @job_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME', @schedule_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME_SCHEDULE';
EXEC sp_add_jobserver @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
EXEC sp_start_job @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
END;
GO
CREATE USER CUSTOM_USERNAME FOR LOGIN CUSTOM_USERNAME;
GO
GRANT EXECUTE ON hk_job_starter_CUSTOM_USERNAME TO CUSTOM_USERNAME;
GO
Здесь нам нужно создать работу, которая вызывает процедуру каждую ночь (работа по дому). С Oracle это просто, мы просто предоставляем право CREATE JOB и используем пакет DBMS_SCHEDULER, чтобы создать задание внутри схемы. Однако в MS SQL задания хранятся в «центральном» месте, в одном месте для всех баз данных. Поэтому мы решили добавить имя базы данных в само имя задания, поскольку у нас будет несколько экземпляров одной и той же базы данных на одном и том же сервере БД с разными именами, MyDB1, MyDB2 и т. Д. c. Поэтому у нас должны быть такие работы, как MV_HOUSEKEEPING_JOB_MyDB1, MV_HOUSEKEEPING_JOB_MyDB2 и др. c. Соответственно, имя базы данных добавляется к имени шага задания, имени расписания и имени процедуры (эта процедура фактически создаст задание и будет вызвана после установки соответствующей служебной процедуры более поздним сценарием SQL). ).
Как видите, три экземпляра $ {custom.db.name} не были заменены, а все остальные были успешно заменены. Вопрос в том, почему? Мы подозреваем, что это может быть результатом какой-то проблемы, по какой-то причине Maven видит это как нечто, что не должно быть заменено? Я даже не уверен, что это имеет смысл.