在版本提交之前验证数据库状态的问题
Problem validating state of database before commit of version
我正在研究 Flyway,除此之外,我想在提交版本之前验证数据库中的某些内容。例如,我希望以下迁移失败:
--#SET TERMINATOR @
CREATE TABLE TMP.DUMMY(x int) @
create or replace procedure TMP.DOUBLE_DUMMY()
begin
update TMP.DUMMY set x = 2*x;
end @
-- TMP.DOUBLE_DUMMY() is invalidated
DROP TABLE TMP.DUMMY @
这很容易检测到,因为我可以尝试重新编译无效的程序:
for c1 as c1 cursor for
select rtrim(procschema) || '.' || rtrim(procname) as p
, rtrim(procschema) || '.' || rtrim(specificname) as s
, text
from syscat.procedures
where procschema = in_schema
and valid <> 'Y'
and language = 'SQL'
order by create_time
do
execute immediate 'drop specific procedure ' || s;
execute immediate text;
end for;
如果有什么东西坏了,程序的重新编译就会失败。但是,我似乎找不到可以在文件中最后一条语句之后但在插入和提交新版本之前使用的回调。
我想到的下一个想法是在 flyway 版本上创建一个触发器 table。类似于:
CREATE OR REPLACE TRIGGER FLYWAY.IRA_FLYWAY_SCHEMA_HISTORY
AFTER INSERT ON FLYWAY.FLYWAY_SCHEMA_HISTORY
REFERENCING NEW AS N
FOR EACH ROW
BEGIN ATOMIC
CALL COMPILE_SCHEMAS();
END @
然而事实证明,flyway 对文件中的语句使用一个连接,对版本 table 使用一个连接。这会导致锁定超时,因为在重新编译出现时对象上有一个 X 锁定。
我似乎找不到一些 属性 可以阻止 Flyway 使用两个连接。从逻辑的角度来看,为一个工作单元使用两个事务似乎是违反直觉的。我无法想象您想提交一个并回滚另一个的情况。
关于如何注入这样的控制机制,而不必将控制放在迁移文件中,还有其他想法吗?
afterEachMigrate 实际上是这样工作的。诀窍是版本的提交是一个单独的事务,它等待 afterEachMigrate 完成。
我正在研究 Flyway,除此之外,我想在提交版本之前验证数据库中的某些内容。例如,我希望以下迁移失败:
--#SET TERMINATOR @
CREATE TABLE TMP.DUMMY(x int) @
create or replace procedure TMP.DOUBLE_DUMMY()
begin
update TMP.DUMMY set x = 2*x;
end @
-- TMP.DOUBLE_DUMMY() is invalidated
DROP TABLE TMP.DUMMY @
这很容易检测到,因为我可以尝试重新编译无效的程序:
for c1 as c1 cursor for
select rtrim(procschema) || '.' || rtrim(procname) as p
, rtrim(procschema) || '.' || rtrim(specificname) as s
, text
from syscat.procedures
where procschema = in_schema
and valid <> 'Y'
and language = 'SQL'
order by create_time
do
execute immediate 'drop specific procedure ' || s;
execute immediate text;
end for;
如果有什么东西坏了,程序的重新编译就会失败。但是,我似乎找不到可以在文件中最后一条语句之后但在插入和提交新版本之前使用的回调。
我想到的下一个想法是在 flyway 版本上创建一个触发器 table。类似于:
CREATE OR REPLACE TRIGGER FLYWAY.IRA_FLYWAY_SCHEMA_HISTORY
AFTER INSERT ON FLYWAY.FLYWAY_SCHEMA_HISTORY
REFERENCING NEW AS N
FOR EACH ROW
BEGIN ATOMIC
CALL COMPILE_SCHEMAS();
END @
然而事实证明,flyway 对文件中的语句使用一个连接,对版本 table 使用一个连接。这会导致锁定超时,因为在重新编译出现时对象上有一个 X 锁定。
我似乎找不到一些 属性 可以阻止 Flyway 使用两个连接。从逻辑的角度来看,为一个工作单元使用两个事务似乎是违反直觉的。我无法想象您想提交一个并回滚另一个的情况。
关于如何注入这样的控制机制,而不必将控制放在迁移文件中,还有其他想法吗?
afterEachMigrate 实际上是这样工作的。诀窍是版本的提交是一个单独的事务,它等待 afterEachMigrate 完成。