- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 9 anos, 11 meses atrás por alef pires de oliveira.
-
AutorPosts
-
19 de dezembro de 2014 às 10:12 pm #107252alef pires de oliveiraParticipante
Pessoal,
Preciso de ajuda em uma trigger de auditoria,essa trigger tem a função de inserir na tabela log a execução de comandos ddl em banco. O problema é que ela não dispara em todos os schemas somente em um deles.
Abaixo segue a Trigger:
CREATE OR REPLACE TRIGGER QUALIDADE.tr_log_ddl
AFTER DDL
ON QUALIDADE.SCHEMA
— DISABLE
DECLARE
tmpVar NUMBER;vsql_text ora_name_list_t;
vcomando_sql CLOB;
n NUMBER;
V_UsuarioAtualizacao CHAR (255);
V_OSUSER VARCHAR2 (255);
V_MAQUINA VARCHAR2 (255);
BEGIN
SELECT DISTINCT OSUSER, MACHINE
INTO V_OSUSER, V_MAQUINA
FROM V$SESSION
WHERE AUDSID = USERENV (‘SESSIONID’)
AND STATUS IN (‘ACTIVE’, ‘INACTIVE’)
AND ROWNUM = 1;V_UsuarioAtualizacao := USER;
IF PKG_AUDIT.COD_USUARIO IS NOT NULL
THEN
V_UsuarioAtualizacao := PKG_AUDIT.COD_USUARIO;
END IF;n := ora_sql_txt (vsql_text);
if vsql_text (1) like ‘ALTER %COMPILE%’ then
return;
end if;<
>
FOR i IN 1 .. n
LOOP
— exit busca_comando when length(vcomando_sql || vsql_text (i)) > 4000;
vcomando_sql := vcomando_sql || vsql_text (i);
END LOOP busca_comando;IF vcomando_sql not like ‘ALTER %COMPILE%’ THEN
INSERT INTO qualidade.log_ddl (operacao,
object_owner,
object_name,
object_type,
sql_text,
usuario_oracle,
dthora,
usuario_atualizacao,
osuser,
maquina)
VALUES (ora_sysevent,
ora_dict_obj_owner,
ora_dict_obj_name,
ora_dict_obj_type,
vcomando_sql,
USER,
SYSDATE,
V_UsuarioAtualizacao,
V_OSUSER,
V_MAQUINA);
end if;
END tr_log_ddl;
/22 de dezembro de 2014 às 4:59 am #107254caadecarvalhoParticipanteOlá, alef pires de oliveira,
Você pode habilitar DDL para toda a base de dados alterando o código para AFTER DDL ON DATABASE. Caso queira modificar o código, utilize da função SYS_CONTEXT para retornar os dados necessários para fazer o INSERT ao invés de SELECTs em GV$s . A
Abraços.
26 de dezembro de 2014 às 7:46 pm #107264alef pires de oliveiraParticipanteCarlos,
Eu alterei o codigo para after ddl on database e deu o seguinte erro ORA-01031: privilégios insuficientes ?
att
Alef Pires29 de dezembro de 2014 às 2:24 pm #107267rmanParticipante@alef pires de oliveira
Para utilizar a cláusula ON DATABASE é necessário o privilegio de ADMINISTER DATABASE TRIGGER.
Com um usuário DBA conceda o privilegio:
GRANT ADMINISTER DATABASE TRIGGER TO QUALIDADE
29 de dezembro de 2014 às 8:31 pm #107268alef pires de oliveiraParticipanterman,
Deu certo, muito obrigado pela ajuda -
AutorPosts
- Você deve fazer login para responder a este tópico.