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

Responder a