estou criando uma trigger para salvar os logs de registros em uma tabela de auditoria e gostaria de saber se consigo setar na tabela de auditoria qual foi a coluna alterada/atualizada e de qual tabela é essa coluna. Preciso apresentar para o auditor essas informações.
CREATE TABLE AUDIT
(
ID_AUDIT NUMBER NOT NULL,
USUARIO VARCHAR2(45) NOT NULL
DATA_REGISTRO DATE NOT NULL,
MAQUINA_USU VARCHAR2(45) NOT NULL,
TIPO_ACAO VARCHAR2(45) NOT NULL,
NM_TABELA VARCHAR2(45) NOT NULL,
NM_COLUNA VARCHAR2(45) NOT NULL,
NEW_ID_VALOR NUMBER,
OLD_ID_VALOR NUMBER,
NEW_VALOR VARCHAR2(45),
OLD_VALOR VARCHAR2(45)
);
No meu trabalho, cada tabela tem uma outra tabela de auditoria, assim a parte de "pegar" qual tabela está "sofrendo" a alteração não seria necessário, seu caso precisa realmente de 1 tabela só para todas as modificações do RDBMS ?
Sim. Foi especificado que no projeto deveria ter apenas uma tabela de auditoria justamente para evitar a criação de várias tabelas, facilitando assim futuras manutenções.
Tiago, eu estava fazendo as tabelas de auditoria como você falou, criando uma tabela de auditoria para cada tabela do banco. Porém me solicitaram essa mudança.
Eu até consigo registrar o nome da tabela está, porém, a minha grande dificuldade tem sido em registrar o nome da coluna.
DECLARE
NM_TABELA VARCHAR2(65);
BEGIN
NM_TABELA := 'TABELA_AUDITADA';
A única diferença do procedimento que você utiliza na sua empresa, é que existe apenas uma tabela de auditoria para todas as tabelas do banco mas ainda sim existe uma trigger de auditoria para cada tabela.
Acredito que a única forma dinâmica de você capturar isso seja através de uma consulta em tempo de execução na all_tab_columns, porém, você precisaria verificar coluna a coluna se os valores :new e :old são diferentes, pelo caso de uso que está sendo sugerido, que é usar apenas uma tabela de log, precisa tomar muito cuidado com performance, já que é um processo um tanto quanto custoso para uma trigger, principalmente se você trabalha com uma grande massa de dados.
Outro ponto que precisa antentar é se todas as tabelas do seu sistema possuem chave primária simples, ou seja, com apenas uma coluna, pelo que percebi você usa as colunas NEW_ID_VALOR e OLD_ID_VALOR para guardar isso, você só precisaria guardar o new e o old caso seja permitido alterar a Pk da tabela, não aconselho.