Compare commits
No commits in common. "5f00a093e41689437e6bd62259c07e35c088231e" and "a4c2cd3eddc19dd3a91e39815a6ed7841c36eb9a" have entirely different histories.
5f00a093e4
...
a4c2cd3edd
@ -86,7 +86,7 @@ end; $$;
|
||||
Returns the current http request as set via `basis.defineContext(...)`.
|
||||
Raises exception if not set.
|
||||
*/
|
||||
create or replace function basis.currentRequest()
|
||||
create or replace function currentRequest()
|
||||
returns text
|
||||
stable -- leakproof
|
||||
language plpgsql as $$
|
||||
|
@ -21,7 +21,7 @@ do $$
|
||||
/*
|
||||
A table storing transactions with context data.
|
||||
*/
|
||||
create table basis.tx_context
|
||||
create table tx_context
|
||||
(
|
||||
txId xid8 primary key not null,
|
||||
txTimestamp timestamp not null,
|
||||
@ -31,7 +31,7 @@ create table basis.tx_context
|
||||
currentRequest text not null
|
||||
);
|
||||
|
||||
create index on basis.tx_context using brin (txTimestamp);
|
||||
create index on tx_context using brin (txTimestamp);
|
||||
--//
|
||||
|
||||
-- ============================================================================
|
||||
@ -40,28 +40,28 @@ create index on basis.tx_context using brin (txTimestamp);
|
||||
/*
|
||||
A table storing the transaction audit journal for all target tables it's configured for.
|
||||
*/
|
||||
create table basis.tx_journal
|
||||
create table tx_journal
|
||||
(
|
||||
txId xid8 not null references basis.tx_context (txId),
|
||||
txId xid8 not null references tx_context (txId),
|
||||
targetTable text not null,
|
||||
targetUuid uuid not null, -- Assumes that all audited tables have a uuid column.
|
||||
targetOp operation not null,
|
||||
targetDelta jsonb
|
||||
);
|
||||
|
||||
create index on basis.tx_journal (targetTable, targetUuid);
|
||||
create index on tx_journal (targetTable, targetUuid);
|
||||
--//
|
||||
|
||||
-- ============================================================================
|
||||
--changeset audit-TX-JOURNAL-VIEW:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
/*
|
||||
A view combining basis.tx_journal with basis.tx_context.
|
||||
A view combining tx_journal with tx_context.
|
||||
*/
|
||||
create view basis.tx_journal_v as
|
||||
create view tx_journal_v as
|
||||
select txc.*, txj.targettable, txj.targetop, txj.targetuuid, txj.targetdelta
|
||||
from basis.tx_journal txj
|
||||
left join basis.tx_context txc using (txId)
|
||||
from tx_journal txj
|
||||
left join tx_context txc using (txId)
|
||||
order by txc.txtimestamp;
|
||||
--//
|
||||
|
||||
@ -71,7 +71,7 @@ select txc.*, txj.targettable, txj.targetop, txj.targetuuid, txj.targetdelta
|
||||
/*
|
||||
Trigger function for transaction audit journal.
|
||||
*/
|
||||
create or replace function basis.tx_journal_trigger()
|
||||
create or replace function tx_journal_trigger()
|
||||
returns trigger
|
||||
language plpgsql as $$
|
||||
declare
|
||||
@ -82,24 +82,24 @@ begin
|
||||
curTxId := pg_current_xact_id();
|
||||
|
||||
insert
|
||||
into basis.tx_context (txId, txTimestamp, currentUser, assumedRoles, currentTask, currentRequest)
|
||||
into tx_context (txId, txTimestamp, currentUser, assumedRoles, currentTask, currentRequest)
|
||||
values ( curTxId, now(),
|
||||
currentUser(), assumedRoles(), curTask, basis.currentRequest())
|
||||
currentUser(), assumedRoles(), curTask, currentRequest())
|
||||
on conflict do nothing;
|
||||
|
||||
case tg_op
|
||||
when 'INSERT' then insert
|
||||
into basis.tx_journal
|
||||
into tx_journal
|
||||
values (curTxId,
|
||||
tg_table_name, new.uuid, tg_op::operation,
|
||||
to_jsonb(new));
|
||||
when 'UPDATE' then insert
|
||||
into basis.tx_journal
|
||||
into tx_journal
|
||||
values (curTxId,
|
||||
tg_table_name, old.uuid, tg_op::operation,
|
||||
basis.jsonb_changes_delta(to_jsonb(old), to_jsonb(new)));
|
||||
when 'DELETE' then insert
|
||||
into basis.tx_journal
|
||||
into tx_journal
|
||||
values (curTxId,
|
||||
tg_table_name, old.uuid, 'DELETE'::operation,
|
||||
null::jsonb);
|
||||
@ -116,7 +116,7 @@ end; $$;
|
||||
Trigger function for transaction audit journal.
|
||||
*/
|
||||
|
||||
create or replace procedure basis.create_journal(targetTable varchar)
|
||||
create or replace procedure create_journal(targetTable varchar)
|
||||
language plpgsql as $$
|
||||
declare
|
||||
createTriggerSQL varchar;
|
||||
@ -125,7 +125,7 @@ begin
|
||||
|
||||
createTriggerSQL = 'CREATE TRIGGER ' || targetTable || '_journal' ||
|
||||
' AFTER INSERT OR UPDATE OR DELETE ON ' || targetTable ||
|
||||
' FOR EACH ROW EXECUTE PROCEDURE basis.tx_journal_trigger()';
|
||||
' FOR EACH ROW EXECUTE PROCEDURE tx_journal_trigger()';
|
||||
execute createTriggerSQL;
|
||||
end; $$;
|
||||
--//
|
||||
|
@ -27,7 +27,7 @@ begin
|
||||
|
||||
if historicalTxIdSetting is null or historicalTxIdSetting = '' then
|
||||
select historicalTimestampSetting::timestamp into historicalTimestamp;
|
||||
select max(txc.txid) from basis.tx_context txc where txc.txtimestamp <= historicalTimestamp into historicalTxId;
|
||||
select max(txc.txid) from tx_context txc where txc.txtimestamp <= historicalTimestamp into historicalTxId;
|
||||
else
|
||||
historicalTxId = historicalTxIdSetting::xid8;
|
||||
end if;
|
||||
@ -110,7 +110,7 @@ begin
|
||||
createHistTableSql = '' ||
|
||||
'CREATE TABLE ' || baseTable || '_ex (' ||
|
||||
' version_id serial PRIMARY KEY,' ||
|
||||
' txid xid8 NOT NULL REFERENCES basis.tx_context(txid),' ||
|
||||
' txid xid8 NOT NULL REFERENCES tx_context(txid),' ||
|
||||
' trigger_op tx_operation NOT NULL,' ||
|
||||
' alive boolean not null,' ||
|
||||
' LIKE ' || baseTable ||
|
||||
@ -131,7 +131,7 @@ begin
|
||||
createViewSQL = format(
|
||||
'CREATE OR REPLACE VIEW %1$s AS' ||
|
||||
'(' ||
|
||||
-- make sure the function is only called once, not for every matching row in basis.tx_context
|
||||
-- make sure the function is only called once, not for every matching row in tx_context
|
||||
' WITH txh AS (SELECT tx_history_txid() AS txid) ' ||
|
||||
' SELECT %2$s' ||
|
||||
' FROM %3$s' ||
|
||||
@ -140,7 +140,7 @@ begin
|
||||
' (' ||
|
||||
' SELECT max(ex.version_id) AS history_id' ||
|
||||
' FROM %3$s AS ex' ||
|
||||
' JOIN basis.tx_context as txc ON ex.txid = txc.txid' ||
|
||||
' JOIN tx_context as txc ON ex.txid = txc.txid' ||
|
||||
' WHERE txc.txid <= (SELECT txid FROM txh)' ||
|
||||
' GROUP BY uuid' ||
|
||||
' )' ||
|
||||
|
@ -44,7 +44,7 @@ create table RbacUser
|
||||
name varchar(63) not null unique
|
||||
);
|
||||
|
||||
call basis.create_journal('RbacUser');
|
||||
call create_journal('RbacUser');
|
||||
|
||||
create or replace function createRbacUser(userName varchar)
|
||||
returns uuid
|
||||
@ -102,7 +102,7 @@ create table RbacObject
|
||||
unique (objectTable, uuid)
|
||||
);
|
||||
|
||||
call basis.create_journal('RbacObject');
|
||||
call create_journal('RbacObject');
|
||||
|
||||
--//
|
||||
|
||||
@ -174,7 +174,7 @@ create table RbacRole
|
||||
unique (objectUuid, roleType)
|
||||
);
|
||||
|
||||
call basis.create_journal('RbacRole');
|
||||
call create_journal('RbacRole');
|
||||
|
||||
create type RbacRoleDescriptor as
|
||||
(
|
||||
@ -379,7 +379,7 @@ create index on RbacPermission (opTableName, op);
|
||||
ALTER TABLE RbacPermission
|
||||
ADD CONSTRAINT RbacPermission_uc UNIQUE NULLS NOT DISTINCT (objectUuid, op, opTableName);
|
||||
|
||||
call basis.create_journal('RbacPermission');
|
||||
call create_journal('RbacPermission');
|
||||
|
||||
create or replace function createPermission(forObjectUuid uuid, forOp RbacOp, forOpTableName text = null)
|
||||
returns uuid
|
||||
@ -497,7 +497,7 @@ create table RbacGrants
|
||||
create index on RbacGrants (ascendantUuid);
|
||||
create index on RbacGrants (descendantUuid);
|
||||
|
||||
call basis.create_journal('RbacGrants');
|
||||
call create_journal('RbacGrants');
|
||||
create or replace function findGrantees(grantedId uuid)
|
||||
returns setof RbacReference
|
||||
returns null on null input
|
||||
|
@ -20,5 +20,5 @@ create table if not exists hs_office_contact
|
||||
--changeset hs-office-contact-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_contact');
|
||||
call create_journal('hs_office_contact');
|
||||
--//
|
||||
|
@ -31,5 +31,5 @@ create table if not exists hs_office_person
|
||||
--changeset hs-office-person-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_person');
|
||||
call create_journal('hs_office_person');
|
||||
--//
|
||||
|
@ -33,5 +33,5 @@ create table if not exists hs_office_relation
|
||||
--changeset hs-office-relation-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_relation');
|
||||
call create_journal('hs_office_relation');
|
||||
--//
|
||||
|
@ -23,7 +23,7 @@ create table hs_office_partner_details
|
||||
--changeset hs-office-partner-DETAILS-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_partner_details');
|
||||
call create_journal('hs_office_partner_details');
|
||||
--//
|
||||
|
||||
-- ============================================================================
|
||||
@ -83,5 +83,5 @@ create trigger hs_office_partner_delete_dependents_trigger
|
||||
--changeset hs-office-partner-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_partner');
|
||||
call create_journal('hs_office_partner');
|
||||
--//
|
||||
|
@ -18,5 +18,5 @@ create table hs_office_bankaccount
|
||||
--changeset hs-office-bankaccount-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_bankaccount');
|
||||
call create_journal('hs_office_bankaccount');
|
||||
--//
|
||||
|
@ -61,5 +61,5 @@ execute procedure deleteHsOfficeDependentsOnDebitorDelete();
|
||||
--changeset hs-office-debitor-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_debitor');
|
||||
call create_journal('hs_office_debitor');
|
||||
--//
|
||||
|
@ -21,5 +21,5 @@ create table if not exists hs_office_sepamandate
|
||||
--changeset hs-office-sepamandate-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_sepamandate');
|
||||
call create_journal('hs_office_sepamandate');
|
||||
--//
|
||||
|
@ -36,5 +36,5 @@ create table if not exists hs_office_membership
|
||||
--changeset hs-office-membership-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_membership');
|
||||
call create_journal('hs_office_membership');
|
||||
--//
|
||||
|
@ -64,5 +64,5 @@ alter table hs_office_coopsharestransaction
|
||||
--changeset hs-office-coopshares-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_coopsharestransaction');
|
||||
call create_journal('hs_office_coopsharestransaction');
|
||||
--//
|
||||
|
@ -72,5 +72,5 @@ alter table hs_office_coopassetstransaction
|
||||
--changeset hs-office-coopassets-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_office_coopassetstransaction');
|
||||
call create_journal('hs_office_coopassetstransaction');
|
||||
--//
|
||||
|
@ -18,7 +18,7 @@ create table if not exists hs_booking_project
|
||||
--changeset hs-booking-project-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_booking_project');
|
||||
call create_journal('hs_booking_project');
|
||||
--//
|
||||
|
||||
|
||||
|
@ -35,7 +35,7 @@ create table if not exists hs_booking_item
|
||||
--changeset hs-booking-item-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
call basis.create_journal('hs_booking_item');
|
||||
call create_journal('hs_booking_item');
|
||||
--//
|
||||
|
||||
|
||||
|
@ -166,7 +166,7 @@ execute procedure hs_hosting_asset_booking_item_hierarchy_check_tf();
|
||||
-- ============================================================================
|
||||
--changeset hs-hosting-asset-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
call basis.create_journal('hs_hosting_asset');
|
||||
call create_journal('hs_hosting_asset');
|
||||
--//
|
||||
|
||||
|
||||
|
@ -69,7 +69,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'caption'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_booking_item';
|
||||
""");
|
||||
|
||||
|
@ -64,7 +64,7 @@ class HsBookingProjectRepositoryIntegrationTest extends ContextBasedTestWithClea
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'caption'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_booking_project';
|
||||
""");
|
||||
|
||||
|
@ -77,7 +77,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'caption'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_hosting_asset';
|
||||
""");
|
||||
|
||||
|
@ -299,8 +299,8 @@ public class CsvDataImport extends ContextBasedTest {
|
||||
jpaAttempt.transacted(() -> {
|
||||
context(rbacSuperuser);
|
||||
em.createNativeQuery("delete from rbacuser_rv where name not like 'superuser-%'").executeUpdate();
|
||||
em.createNativeQuery("delete from basis.tx_journal where true").executeUpdate();
|
||||
em.createNativeQuery("delete from basis.tx_context where true").executeUpdate();
|
||||
em.createNativeQuery("delete from tx_journal where true").executeUpdate();
|
||||
em.createNativeQuery("delete from tx_context where true").executeUpdate();
|
||||
}).assertSuccessful();
|
||||
}
|
||||
|
||||
|
@ -272,7 +272,7 @@ class HsOfficeBankAccountRepositoryIntegrationTest extends ContextBasedTestWithC
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'iban'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_bankaccount';
|
||||
""");
|
||||
|
||||
|
@ -257,7 +257,7 @@ class HsOfficeContactRbacRepositoryIntegrationTest extends ContextBasedTestWithC
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'caption'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_contact';
|
||||
""");
|
||||
|
||||
|
@ -221,7 +221,7 @@ class HsOfficeCoopAssetsTransactionRepositoryIntegrationTest extends ContextBase
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'reference'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_coopassetstransaction';
|
||||
""");
|
||||
|
||||
|
@ -220,7 +220,7 @@ class HsOfficeCoopSharesTransactionRepositoryIntegrationTest extends ContextBase
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'reference'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_coopsharestransaction';
|
||||
""");
|
||||
|
||||
|
@ -590,7 +590,7 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTestWithClean
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'defaultprefix'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_debitor';
|
||||
""");
|
||||
|
||||
|
@ -337,7 +337,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTestWithCl
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'membernumbersuffix'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_membership';
|
||||
""");
|
||||
|
||||
|
@ -434,7 +434,7 @@ class HsOfficePartnerRepositoryIntegrationTest extends ContextBasedTestWithClean
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'partnernumber'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_partner';
|
||||
""");
|
||||
|
||||
|
@ -261,7 +261,7 @@ class HsOfficePersonRepositoryIntegrationTest extends ContextBasedTestWithCleanu
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'tradename', targetdelta->>'lastname'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_person';
|
||||
""");
|
||||
|
||||
|
@ -395,7 +395,7 @@ class HsOfficeRelationRepositoryIntegrationTest extends ContextBasedTestWithClea
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'mark'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_relation';
|
||||
""");
|
||||
|
||||
|
@ -380,7 +380,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTestWithC
|
||||
// given
|
||||
final var query = em.createNativeQuery("""
|
||||
select currentTask, targetTable, targetOp, targetdelta->>'reference'
|
||||
from basis.tx_journal_v
|
||||
from tx_journal_v
|
||||
where targettable = 'hs_office_sepamandate';
|
||||
""");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user