On Mon, Jan 26, 2015 at 7:45 PM, Luiz Carlos L. Nogueira Jr. <
[email protected]> wrote:

> Peguei umas idéias na internet e fiz uma auditoria de DDLs
>
> CREATE SCHEMA audit;
>
> CREATE TABLE audit.Auditoria (
>     Data TIMESTAMP,
>     Usuario varchar(50) ,
>     Aplicacao varchar(50),
>     IP varchar(50),
>     Query varchar(500)
> );
>
> CREATE OR REPLACE FUNCTION audit.fn_ddl_trigger()
>   RETURNS event_trigger
>  LANGUAGE plpgsql
>   AS $$
> BEGIN
>   insert into audit.Auditoria
>   (Data,
>     Usuario,
>     Aplicacao,
>     IP,
>     Query)
>   values
> (current_timestamp,
> session_user,
> (SELECT setting FROM pg_settings WHERE name = 'application_name') ,
> inet_client_addr(),                           -- client_addr
> current_query());
> END;
> $$;
>
> CREATE EVENT TRIGGER ddl_trigger ON ddl_command_start
>    EXECUTE PROCEDURE audit.fn_ddl_trigger();
>
>
> Só que queria inserir na tabela Auditoria, o nome da tabela   e a ação
> executada (DROP, CREATE, etc).
> Na versão original essas variáveis aparecem na current_query()  mas queria
> em colunas separadas.
>

Quanto à ação executada, é fácil, basta usar a variável TG_TAG (ela vai ter
uma string com valores como: 'ALTER TABLE', 'CREATE TABLE', etc.).

Já quanto ao nome da tabela, infelizmente não há interface para isso hoje.
Você pode tentar fazer um parser do comando, mas isso não é simples e um
tanto frágil (o principal motivo é que multi-comandos podem disparar a
trigger várias vezes e ainda sim ser visto como o mesmo comando).



> Queria também o usuário de SO que executou,
>

Você pode pegar o usuário conectado ao banco (o que já está fazendo), mas
do SO nem faz muito sentido, e se for uma conexão remota?

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a