Zdravím, my jsme toto řešili na dvou projektech takto: - hibernate pro to má podporu. Nicméně některé věci tam jsou složitější. Je možné získat předchozí a novou hodnotu. Ale např. u vazby N ku N je to docela těžší. Pokud budete mít zájem o kód rád zveřejním.
- u jedno jsme používali Oracle. Oracle má sice nějakou podporu pro
auditování (myslím, že Audit Trail), ale my jsme stejně použili
triggery.
K zapamatování jsme použili tzv. package:
CREATE OR REPLACE PACKAGE AuditPackage AS
UserID NUMBER(9, 0);
END;
/
CREATE OR REPLACE FUNCTION SetUserID(newValue NUMBER) RETURN NUMBER AS
prevID NUMBER(9, 0);
BEGIN
prevID := AuditPackage.UserID;
AuditPackage.UserID := newValue;
return prevID;
END;
/
A trigger samotný:
CREATE OR REPLACE TRIGGER ACCOUNTS$AUDITLOG
AFTER INSERT OR DELETE OR UPDATE ON ACCOUNTS FOR EACH ROW
DECLARE
action CHAR(1) := NULL;
curTime TIMESTAMP;
id NUMBER(9, 0);
tmpNew VARCHAR2(255);
tmpOld VARCHAR2(255);
BEGIN
curTime := current_timestamp;
SELECT GEN_ID_AUDIT.NextVal INTO id FROM dual;
IF INSERTING THEN
action := 'I';
-- Action row
INSERT INTO AUDITTABLE VALUES (id, curTime, AuditPackage.UserID,
action, 'ACCOUNTS', :NEW.ID);
-- Values
INSERT INTO AUDITVALUES VALUES (id,
'ISSUERID', :NEW.ISSUERID, :OLD.ISSUERID);
ELSIF UPDATING THEN
action := 'U';
-- Action row
INSERT INTO AUDITTABLE VALUES (id, curTime, AuditPackage.UserID,
action, 'ACCOUNTS', :OLD.ID);
-- Values
IF UPDATING ('ISSUERID') THEN
INSERT INTO AUDITVALUES VALUES (id,
'ISSUERID', :NEW.ISSUERID, :OLD.ISSUERID);
ELSIF UPDATING ('POOLID') THEN
INSERT INTO AUDITVALUES VALUES (id,
'POOLID', :NEW.POOLID, :OLD.POOLID);
END IF;
ELSE
action := 'D';
-- Action row
INSERT INTO AUDITTABLE VALUES (id, curTime, AuditPackage.UserID,
action, 'ACCOUNTS', :OLD.ID);
-- Values
INSERT INTO AUDITVALUES VALUES (id,
'ISSUERID', :NEW.ISSUERID, :OLD.ISSUERID);
END IF;
END;
/
V případě oracle kódu jsme měli dvě tabulky AUDITTABLE (změna) a
AUDITVALUE (změněná hodnota). Výhodou je, že je to hezky normalizované.
Nevýhodou je vysoká náročnost. Když jsme v případě hibernate změny
serializovali jako jednu položku tak nárůst výkonu byl znatelný.
S pozdravem
Petr Ferschmann
Tomas Zverina píše v Po 18. 12. 2006 v 18:13 +0100:
> Zdravim,
>
> mam tu pozadavek, aby se sledovaly veskere zmeny, ktere se v DB delaji.
> Napada me nasledujici:
>
> Vytvorime nejake mocne PL/SQL, ktere nam na vsechny tabulky navesi
> trigger, ktery bude vsechny zmeny poctive logovat do nejake jednoduche
> tabulky zmen.
>
> Otazkou je, jak zaridit, aby se trigger dozvedel, ktery uzivatel zmenu
> udelal - uzivatele DB se neshoduji s uzivateli systemu, v systemu je
> datasource, ktery prideluje connections dle potreby.
>
> Myslim, ze by se dal "owrapovat" nejaky transaction manager, nebo
> samotna JDBC connection, aby pred vykonanim vlastniho dotazu nastavila
> nejakou promennou, platnou pro danou session, kterou by pak trigger
> precetl a pouzil jako jmeno autora zmeny.
>
> Neresili jste neco takoveho? Nevite kudy se vydat? DB nam hlida Spring,
> zda se mi, ze tam nekam by se to pripsat dalo ...
>
> Diky!
>
--
Petr Ferschmann
SoftEU s.r.o.
-----------------------------------
Sady Petatricatniku 31
301 00 Plzen
Czech Republic
-----------------------------------
Phone: +420 373 729 300
Fax: +420 373 729 301
Cell: +420 775 638 008
E-mail: [EMAIL PROTECTED]
smime.p7s
Description: S/MIME cryptographic signature
