Em 12-07-2011 14:28, Dickson S. Guedes escreveu:
Ola Daniel! [...]
Para resolver esta situação, No momento em que o usuário se autentica, crio
uma tabela temporária para a sessão com o id do usuário e os dados que
necessito dele. Com isso, posso recuperar os dados do usuário pelas triggers
de auditoria e registrar tudo que o usuário faz em um Schema independente do
usuário do banco de dados. Sem precisar controlar a auditoria pela
aplicação.
Fiquei curioso, como o banco sabe que aquela inserção ou alteração foi
feita pelo usuário 'A' e não pelo usuário 'B'? Ou você não mantém um
pool?
Na autenticação do usuário pela aplicação (autenticando em uma tabela de
contas de usuários), eu crio uma tabela temporária contendo todos os
dados necessários pelos meus gatilhos de auditoria. No momento que
acontece alguma modificação no sistema (normalmente autentico apenas
INSERT, UPDATE e DELETE),o gatilho recolhe os dados do usuário corrente
nesta tabela temporária (que é vista apenas pelo usuário da sessão).
Desta forma, mantenho os logs sempre pelo ID do usuário no sistema.
Um exemplo do código (escrito em PHP):
1- Parte: Criação da tabela
// {{{ Criando Tabela Temporária para armazenamento do
id_usuario_cliente corrente
$stmt = $conexao->query("SELECT table_schema,
table_name,
table_type
FROM
information_schema.tables
WHERE table_name =
'tmp_usuario_logado'
");
if ($stmt->fetchColumn(0)) {
// A tabela ainda não existe, então crio a tabela com os dados da
aplicação após terem sido autenticados no banco
$conexao->query("CREATE TEMP TABLE tmp_usuario_logado (id_usuario
VARCHAR(10))");
....
// Inserindo o id do usuario
$conexao->query("INSERT INTO tmp_usuario_logado VALUES
{$_SESSION['id_usuario']}()");
...
}
2 - Gatilho recolhendo id no ato da atualização (feito em pl/perlu).
(Este modelo de auditoria eu acabei adaptando de um código
disponibilizado na internet a muitos anos atrás, como modifiquei muito e
já passaram por outros desenvolvedores, a fonte acabou se perdendo, mas
fica aqui o aviso dos créditos).
Código fonte |
| #-- Pegando o ID do usuario (o mesmo
sera pego de uma tabela temporaria)
| my $sql = "SELECT id_usuario AS id FROM
tmp_usuario_logado";
| my $temp_id = spi_exec_query($sql);
|
| #-- Tipo de Evento (INSERT / UPDATE /
DELETE)
| my $evento = $_TD->{event};
|
| #-- OID da tabela que recebeu o comando
| my $oid_tabela = $_TD->{relid};
|
| #-- Nome da tabela que recebeu o comando
| my $tabela = $_TD->{relname};
|
| #-- Query para pegar o nome do esquema
| my $sql = "SELECT schemaname AS esq
| FROM pg_catalog.pg_tables
| WHERE tablename = '$tabela'";
| my $esquema = spi_exec_query($sql);
| $nome_esquema = $esquema->{rows}[0]->{esq};
|
| #-- Chave Primária da Tabela
| $pk_tabela = spi_exec_query("SELECT *
FROM public.pegaChavePk($oid_tabela) AS pk");
|
| my $chaves_primarias =
$pk_tabela->{processed};
| my $pk_coluna = "";
| my $pk_valor = "";
...
E por ai vai o código para recolher a os dados
...
*ATENÇÃO*
Existem um inconveniente (para alguns) deste modelo: quando necessito
realizar qualquer alteração direto no banco de dados, eu preciso
executar antes de qualquer coisa uma procedure que cria a estrutura de
tabela temporária (neste caso, com um usuário administrativo), caso
contrario, ele impede a operação (pode ser interessante por questões de
segurança).
Em tempo grato pela contribuição.
[]s
Guedes
Espero ter ajudado em algo.
+--------------------------------------------------------------------------+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--------------------------------------------------------------------------+
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral