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] 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Odpovedet emailem