Nous utilisons un "1 audit table for each monitored Table"; Cependant, dans notre cas emp(PARENT)
table a une table enfant emp_address
qui doit également être surveillé, nous avons donc emp_audit
et emp_address_audit tables
.Postgres SQL pour joindre des tables d'audit parent-enfant
postgres audit SQL: comment joindre des tables PARENT et CHILD à des fins de génération de rapports.
/* Employee table */
create table emp (
emp_id integer primary key,
empnum integer,
empname varchar(50),
loginid varchar(20),
updatetime timestamp
);
/* Address table */
create table emp_addr (
addr_id integer primary key,
emp_id integer, -- references table emp
line1 varchar(30),
line2 varchar(30),
loginid varchar(20),
updatetime timestamp
);
/* Audit table for emp table */
create table emp_audit (
operation character(1),
emp_id integer,
empnum integer,
empname varchar(50),
loginid varchar(20),
updatetime timestamp,
txid bigint
);
/* Audit table for emp_addr table */
create table emp_addr_audit (
operation character(1),
addr_id integer,
emp_id integer,
line1 varchar(30),
line2 varchar(30),
loginid varchar(20),
updatetime timestamp,
txid bigint
);
Nous utilisons Mise en veille prolongée (java) pour les mises à jour et la persistance mise en veille prolongée uniquement les tables dont les colonnes ont été modifiées dans l'opération de mise à jour. Compte tenu de cela, je pourrais avoir plusieurs (disons, 5) enregistrements dans la table emp_addr_audit pour 1 table emp_audit.
Le rapport nécessite 1 ligne pour chaque transaction (modification). Le rapport aura les colonnes suivantes
empnum, empname, ligne1, line2, opération (insertion/suppression/mise à jour), loginid, updatetime
Considérons 2 scénarios pour comprendre ce qui est nécessaire:
- Dans la transaction initiale, seuls les attributs
emp
sont créés. Ensuite, dans une transaction distincte, la ligne correspondante dansemp_addr
est créée. Donc, maintenant, nous avons 1 ligne dans le tableauemp_audit
et 1 ligne dans le tableauemp_addr_audit
. Le rapport comportera 2 lignes (une pour chaque transaction). Les attributsemp
etemp_addr
sont créés en une seule transaction. Cela garantira qu'il y a 1 ligne dansemp_audit
et 1 ligne dansemp_addr_audit
. Maintenant, le rapport aura SEULEMENT 1 ligne (puisque les deux lignes de table ont été créées en une seule transaction).
Quel SQL satisfera les deux scénarios ci-dessus?
MISE À JOUR
Scénario:
Transaction # 1: insérer une ligne dans les deux emp et emp_addr. Cela se traduit par une ligne dans emp_audit et emp_addr_audit. (INSERT)
Transaction # 2: Je mets à jour l'attribut emp 'ci-dessus. Cela entraîne une ligne UPDATE dans emp_audit. Transaction # 3: Je mets à jour l'attribut emp_addr ci-dessus. Cela entraîne une ligne UPDATE dans emp_addr_audit.
J'ai essayé le SQL n ° 1 suivant et il a renvoyé 3 lignes comme prévu;
SQL # 1
SELECT emp.*, addr.*
FROM emp_audit emp
FULL OUTER JOIN emp_addr addr USING(emp_id, txid);
Cependant, quand j'ai ajouté une clause where à SQL, il ne retourne que 2 lignes. La ligne manquante était le résultat de la transaction n ° 3, où seule la ligne de table emp_addr était mise à jour et la ligne de table emp était intacte.
SQL # 2
SELECT emp.*, addr.*
FROM emp_audit emp
FULL OUTER JOIN emp_addr addr USING(emp_id, txid);
WHERE emp.empnum = 20;
Qu'est-ce que SQL Taisez-vous en mesure de me faire 3 lignes pour les 3 opérations afin que je puisse filtrer encore sur la base de empnum?
Merci,