sobre "quem fez a alteracao deste registro na tabela?". Cada uma implementa uma solucao para isso. Como boa parte das novas aplicacoes tem o registro de quem, quando e onde modificou o registro, montei uma package que gera toda a estrutura que preciso (bem proxima a oferecida pelo Oracle Designer):- Operacao: INSERT, UPDATE, DELETE- Usuario: nome do usuario do banco de dados que fez a operacao- Data e hora do evento- Copia do registro modificado-- Create tablecreate table JN_DEFAULT( JN_OPERATION VARCHAR2(3), JN_ORACLE_USER VARCHAR2(256) default user, JN_DATETIME DATE default sysdate, JN_NOTES VARCHAR2(240), JN_APPLN VARCHAR2(35), JN_SESSION NUMBER default userenv('sessionid'), CLIENT_INFO VARCHAR2(256) default SYS_CONTEXT('USERENV', 'CLIENT_INFO'), MODULE VARCHAR2(256) default SYS_CONTEXT('USERENV', 'MODULE'), ACTION VARCHAR2(256) default SYS_CONTEXT('USERENV', 'ACTION'), OS_USER VARCHAR2(256) default SYS_CONTEXT('USERENV', 'OS_USER'), HOST VARCHAR2(256) default SYS_CONTEXT('USERENV', 'HOST'), IP_ADDRESS VARCHAR2(256) default SYS_CONTEXT ('USERENV', 'IP_ADDRESS'));/CREATE OR REPLACE PACKAGE PCK_JOURNAL IS -- Author : JORGE MONTALVAO -- Created : 02/02/2012 12:33:47 -- Purpose : ROTINAS PARA JOURNAL NO BD FUNCTION JN_OPERATION RETURN CHAR; PROCEDURE CREATE_JN(P_TABELA VARCHAR2, P_TABELA_JOUNAL VARCHAR2 DEFAULT NULL);END PCK_JOURNAL;/CREATE OR REPLACE PACKAGE BODY PCK_JOURNAL IS FUNCTION JN_OPERATION RETURN CHAR IS BEGIN IF INSERTING THEN RETURN 'INS'; ELSIF UPDATING THEN RETURN 'UPD'; ELSIF DELETING THEN RETURN 'DEL'; END IF; END; PROCEDURE CREATE_JN(P_TABELA VARCHAR2, P_TABELA_JOUNAL VARCHAR2 DEFAULT NULL) IS V_STMT VARCHAR2(4000 BYTE); V_TABELA_JN VARCHAR2(4000 BYTE); V_LONG LONG; BEGIN -- A VARIAVE P_TABELA_JOUNAL E OPCIONAL. SE INFORMADA USA O VALOR PASSADO POR PARAMETRO AO INVES -- DO PADRAO "NOME_DA_TABELA" || "_JN" PARA TABELA DA JOURNAL SELECT NVL(P_TABELA_JOUNAL,T.TABLE_NAME || '_JN') INTO V_TABELA_JN FROM USER_TABLES T WHERE T.TABLE_NAME = P_TABELA; V_STMT := 'CREATE TABLE ' || V_TABELA_JN || '('; DBMS_OUTPUT.PUT_LINE(V_STMT); FOR COLUNA IN (SELECT T.COLUMN_NAME ,T.DATA_TYPE ,DECODE(T.DATA_TYPE, 'VARCHAR2', '(4000 BYTE)') DATA_SIZE ,T.DATA_DEFAULT ,DECODE(LEAD(T.COLUMN_NAME) OVER (ORDER BY DECODE(T.TABLE_NAME,'JN_DEFAULT','A','B'), T.COLUMN_ID),NULL,1,0) ULTIMO FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME IN ('JN_DEFAULT',P_TABELA) ORDER BY DECODE(T.TABLE_NAME,'JN_DEFAULT','A','B'), T.COLUMN_ID) LOOP V_LONG := COLUNA.DATA_DEFAULT; V_STMT := COLUNA.COLUMN_NAME || ' ' || COLUNA.DATA_TYPE || ' ' || COLUNA.DATA_SIZE; IF SUBSTR(V_LONG,1,4000) IS NOT NULL THEN V_STMT := V_STMT || ' DEFAULT ' || SUBSTR(V_LONG,1,4000) ; END IF; IF COLUNA.ULTIMO = 0 THEN V_STMT := V_STMT || ','; ELSIF COLUNA.ULTIMO = 1 THEN V_STMT := V_STMT || ');'; END IF; DBMS_OUTPUT.PUT_LINE(V_STMT); END LOOP; DBMS_OUTPUT.NEW_LINE; V_STMT := 'comment on table ' || V_TABELA_JN || ' is ''TABELA CRIADA PELA PACKAGE PCK_JOURNAL'';'; DBMS_OUTPUT.PUT_LINE(V_STMT); DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE('create or replace trigger TAIUP_'|| V_TABELA_JN ); DBMS_OUTPUT.PUT_LINE(' after insert or update or delete on ' || P_TABELA); DBMS_OUTPUT.PUT_LINE(' for each row'); DBMS_OUTPUT.PUT_LINE('DECLARE'); DBMS_OUTPUT.PUT_LINE(' V_JN_OPERATION JN_DEFAULT.JN_OPERATION%TYPE;'); DBMS_OUTPUT.PUT_LINE('BEGIN'); DBMS_OUTPUT.PUT_LINE(' /*trigger CRIADA PELA PACKAGE PCK_JOURNAL*/'); DBMS_OUTPUT.PUT_LINE(' V_JN_OPERATION := PCK_JOURNAL.JN_OPERATION;' ); DBMS_OUTPUT.PUT_LINE(' INSERT INTO ' || V_TABELA_JN || '('); DBMS_OUTPUT.PUT_LINE(' JN_OPERATION,'); FOR COLUNA IN (SELECT T.COLUMN_NAME ,DECODE(LEAD(T.COLUMN_NAME) OVER (ORDER BY T.COLUMN_ID),NULL,')',',') FIM_DA_LINHA FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME IN (P_TABELA) ORDER BY T.COLUMN_ID) LOOP DBMS_OUTPUT.PUT_LINE(' ' || COLUNA.COLUMN_NAME || COLUNA.FIM_DA_LINHA); END LOOP; DBMS_OUTPUT.PUT_LINE(' VALUES(' ); DBMS_OUTPUT.PUT_LINE(' V_JN_OPERATION,'); FOR COLUNA IN (SELECT T.COLUMN_NAME ,DECODE(LEAD(T.COLUMN_NAME) OVER (ORDER BY T.COLUMN_ID),NULL,');',',') FIM_DA_LINHA FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME IN (P_TABELA) ORDER BY T.COLUMN_ID) LOOP DBMS_OUTPUT.PUT_LINE(' DECODE(V_JN_OPERATION,''DEL'',:OLD.' || COLUNA.COLUMN_NAME || ',:NEW.' ||COLUNA.COLUMN_NAME ||')' || COLUNA.FIM_DA_LINHA); END LOOP; DBMS_OUTPUT.PUT_LINE('END TAIUP_' || V_TABELA_JN || ';'); END;END PCK_JOURNAL;/Explicacoes:Table JN_DEFAULT: Tabela com colunas padrao para todas as tabelas de log criadas a partir desta package. E uma opcao