Maven liquibase не заменяет все свойства - PullRequest
0 голосов
/ 10 января 2020

У меня есть установка 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 видит это как нечто, что не должно быть заменено? Я даже не уверен, что это имеет смысл.

1 Ответ

0 голосов
/ 13 января 2020

Кажется, мы нашли решение методом проб и ошибок. Похоже, что замена была пропущена только для файлов с одним знаком «@»:

EXEC sp_add_job @job_name = N'MV_HOUSEKEEPING_JOB_${custom.db.name}';
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}';

После добавления еще одного знака «@» замена работала сразу:

EXEC sp_add_job @job_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME', @enabled = 1;
EXEC sp_add_jobserver @job_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME', @server_name = N'(LOCAL)';
EXEC sp_start_job @job_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME', @step_name = N'MV_HOUSEKEEPING_JOB_CUSTOM_USERNAME_STEP';

Мы до сих пор не знаем, почему это работает. Мы рады, что это так, но было бы хорошо узнать, почему. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...