fix(migrations): add Envers revinfo + dictionary_records_aud (0010)

App падал на 'relation revinfo_seq does not exist' — Hibernate Envers
ожидает revinfo_seq + revinfo + <entity>_aud, а hibernate.hbm2ddl.auto=none
не позволяет автогенерацию. Создаём вручную:
  - revinfo_seq (sequence)
  - revinfo (rev INTEGER PK, revtstmp BIGINT)
  - dictionary_records_aud (зеркало + rev, revtype, id+rev composite PK)
This commit is contained in:
Александр Зимин
2026-05-03 23:51:30 +03:00
parent add0394e32
commit 07149cafd8
2 changed files with 74 additions and 0 deletions
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd">
<!--
Hibernate Envers (transaction-time audit) требует:
- revinfo_seq — sequence для rev id
- revinfo — таблица ревизий (id, timestamp)
- dictionary_records_aud — таблица истории для @Audited entity
Изначальный план (см. nsi-hot/audit-log) — общая audit_log table в 0004,
но Hibernate сам генерирует *_aud для каждого @Audited. Создаём вручную,
потому что hibernate.hbm2ddl.auto = none в production.
-->
<changeSet id="0010-1-envers-revinfo-seq" author="ordinis">
<preConditions onFail="MARK_RAN">
<not>
<sequenceExists sequenceName="revinfo_seq"/>
</not>
</preConditions>
<createSequence sequenceName="revinfo_seq" startValue="1" incrementBy="50"/>
</changeSet>
<changeSet id="0010-2-envers-revinfo-table" author="ordinis">
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="revinfo"/>
</not>
</preConditions>
<createTable tableName="revinfo">
<column name="rev" type="INTEGER">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="revtstmp" type="BIGINT"/>
</createTable>
</changeSet>
<changeSet id="0010-3-records-aud-table" author="ordinis">
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="dictionary_records_aud"/>
</not>
</preConditions>
<comment>Зеркало dictionary_records + (rev, revtype) для Envers audit.</comment>
<sql>
CREATE TABLE dictionary_records_aud (
id UUID NOT NULL,
rev INTEGER NOT NULL REFERENCES revinfo(rev),
revtype SMALLINT,
dictionary_id UUID,
business_key VARCHAR(256),
data JSONB,
geometry GEOMETRY(Geometry, 4326),
data_scope VARCHAR(32),
valid_from TIMESTAMPTZ,
valid_to TIMESTAMPTZ,
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ,
created_by VARCHAR(128),
updated_by VARCHAR(128),
version BIGINT,
PRIMARY KEY (id, rev)
);
CREATE INDEX idx_dict_records_aud_rev ON dictionary_records_aud(rev);
CREATE INDEX idx_dict_records_aud_id ON dictionary_records_aud(id);
</sql>
</changeSet>
</databaseChangeLog>
@@ -14,5 +14,6 @@
<include file="changes/0007-add-version-columns.xml"/> <include file="changes/0007-add-version-columns.xml"/>
<include file="changes/0008-fix-scope-check-uppercase.xml"/> <include file="changes/0008-fix-scope-check-uppercase.xml"/>
<include file="changes/0009-fix-records-scope-check.xml"/> <include file="changes/0009-fix-records-scope-check.xml"/>
<include file="changes/0010-envers-tables.xml"/>
</databaseChangeLog> </databaseChangeLog>