Maven liquibase 不替换所有属性
Maven liquibase not replacing all properties
我有一个 LiquiBase 设置,它非常适用于 Oracle SQL 脚本。我们正在将 DB 逻辑迁移到 Microsoft SQL Server,我们发现在一个 SQL 块中,一些 POM 属性没有被 Maven 替换。这是 pom.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 包在模式中创建作业。但是在 MSSQL 中,作业存储在 "central" 位置,所有数据库都在同一位置。所以我们考虑将数据库名称添加到作业名称本身,因为我们将在同一个数据库服务器中拥有同一个数据库的多个实例,具有不同的名称,MyDB1、MyDB2 等。所以我们应该有像 [=27= 这样的作业], MV_HOUSEKEEPING_JOB_MyDB2, 等等。相应地,数据库名称被添加到jobstep名称,计划名称和过程名称中(该过程实际上将创建作业,并将在相关内务处理后调用程序由稍后的 SQL 脚本安装。
如您所见,${custom.db.name} 的三个实例未被替换,而其他所有实例均已成功替换。问题是,为什么?我们怀疑这可能是一些逃避问题的结果,出于某种原因 Maven 认为它不应该被替换?我什至不确定它是否有意义。
看来我们通过反复试验找到了解决方案。似乎只有单个“@”符号的文件才会跳过替换:
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';
我们仍然不知道为什么会这样。我们很高兴这样做,但最好知道为什么。有什么想法吗?
我有一个 LiquiBase 设置,它非常适用于 Oracle SQL 脚本。我们正在将 DB 逻辑迁移到 Microsoft SQL Server,我们发现在一个 SQL 块中,一些 POM 属性没有被 Maven 替换。这是 pom.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 包在模式中创建作业。但是在 MSSQL 中,作业存储在 "central" 位置,所有数据库都在同一位置。所以我们考虑将数据库名称添加到作业名称本身,因为我们将在同一个数据库服务器中拥有同一个数据库的多个实例,具有不同的名称,MyDB1、MyDB2 等。所以我们应该有像 [=27= 这样的作业], MV_HOUSEKEEPING_JOB_MyDB2, 等等。相应地,数据库名称被添加到jobstep名称,计划名称和过程名称中(该过程实际上将创建作业,并将在相关内务处理后调用程序由稍后的 SQL 脚本安装。
如您所见,${custom.db.name} 的三个实例未被替换,而其他所有实例均已成功替换。问题是,为什么?我们怀疑这可能是一些逃避问题的结果,出于某种原因 Maven 认为它不应该被替换?我什至不确定它是否有意义。
看来我们通过反复试验找到了解决方案。似乎只有单个“@”符号的文件才会跳过替换:
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';
我们仍然不知道为什么会这样。我们很高兴这样做,但最好知道为什么。有什么想法吗?