- Este tópico contém 18 respostas, 5 vozes e foi atualizado pela última vez 17 anos atrás por
Leonardo Litz.
-
AutorPosts
-
20 de novembro de 2008 às 3:46 pm #83875
rerodrig
ParticipanteQuando crio uma trigger “before/after create on schema” e dentro dela faço um select na view user_source ou na tabela source$, não consigo pegar o código novo do objeto, muito provavelmente porque no momento da trigger a transação não foi concluída ainda. Alguém sabe algum jeito de conseguir pegar o novo código do objeto dentro desse tipo de trigger (algo semelhante com o ora_dict_obj_name), ou alguém tem alguma idéia se isso é possível??? Valeu!!!
20 de novembro de 2008 às 3:49 pm #83876Marcio68Almeida
ParticipanteVocê quer saber que objetos foram criados ???
Por que não consulta a DBA_OBJECTS, lá tem a data e hora de criação de objetos…20 de novembro de 2008 às 4:00 pm #83877rerodrig
ParticipanteEntão, não é isso, eu preciso pegar o código dos objetos.
20 de novembro de 2008 às 4:07 pm #83878Leonardo Litz
ParticipanteCódigo? Qual código vc precisa, o código fonte?
Faça um select na v_$session, na coluna SQL_TEXT tem o comando que o cara esta dando…
Vlw
20 de novembro de 2008 às 6:10 pm #83880hermesmc
ParticipanteTalves esse artigo possa te ajudar: http://www.linhadecodigo.com.br/Artigo.aspx?id=621
20 de novembro de 2008 às 6:37 pm #83881rerodrig
Participante[quote=”Litz”:33ovqedf]Código? Qual código vc precisa, o código fonte?
Faça um select na v_$session, na coluna SQL_TEXT tem o comando que o cara esta dando…
Vlw[/quote]
Preciso do código fonte do objeto. Nessa view não tem a coluna SQL_TEXT (Oracle 10g).
[quote=”hermesmc”:33ovqedf]
Talves esse artigo possa te ajudar: http://www.linhadecodigo.com.br/Artigo.aspx?id=621
[/quote]No caso desse tipo de trigger não sei se tem como usar o new e old, pois tentei colocar aqui, e simplesmente quando vou criar a trigger, desconecta do Oracle e não cria a trigger, acho que não tem como usar essas referências nas triggers de sistema.
Valeu!
20 de novembro de 2008 às 6:56 pm #83882Leonardo Litz
ParticipanteDesculpe, confundi, é na sql area….
segue abaixo a query que utilizo:
select a.username as “USUARIO”,
a.logon_time as “LOGIN”,
a.terminal as “TERMINAL”,
sys_context(‘USER’,’IP_ADDRESS’) as “IP”,
a.osuser as “USUARIO_SISTEMA_OPERACIONAL”,
a.program as “PROGRAMA”,
b.sql_text as “SQL”,
decode (a.command,
1,’CREATE TABLE’,
2,’INSERT’,
3,’SELECT’,
6,’UPDATE’,
7,’DELETE’,
9,’CREATE INDEX’,
10,’DROP INDEX’,
11,’ALTER INDEX’,
12,’DROP TABLE’,
13,’CREATE SEQUENCE’,
14,’ALTER SEQUENCE’,
15,’ALTER TABLE’,
16,’DROP SEQUENCE’,
17,’GRANT OBJECT’,
18,’REVOKE OBJECT’,
19,’CREATE SYNONYM’,
20,’DROP SYNONYM’,
21,’CREATE VIEW’,
22,’DROP VIEW’,
24,’CREATE PROCEDURE’,
25,’ALTER PROCEDURE’,
28,’RENAME’,
29,’COMMENT’,
32,’CREATE DATABASE LINK’,
33,’DROP DATABASE LINK’,
34,’CREATE DATABASE’,
35,’ALTER DATABASE’,
39,’CREATE TABLESPACE’,
40,’ALTER TABLESPACE’,
41,’DROP TABLESPACE’,
42,’ALTER SESSION’,
43,’ALTER USER’,
47,’PL/SQL EXECUTE’,
49,’ALTER SYSTEM’,
51,’CREATE USER’,
52,’CREATE ROLE’,
53,’DROP USER’,
54,’DROP ROLE’,
56,’CREATE SCHEMA’,
59,’CREATE TRIGGER’,
60,’ALTER TRIGGER’,
61,’DROP TRIGGER’,
65,’CREATE PROFILE’,
66,’DROP PROFILE’,
67,’ALTER PROFILE’,
68,’DROP PROCEDURE’,
71,’CREATE MATERIALIZED VIEW LOG’,
72,’ALTER MATERIALIZED VIEW LOG’,
73,’DROP MATERIALIZED VIEW LOG’,
74,’CREATE MATERIALIZED VIEW’,
75,’ALTER MATERIALIZED VIEW’,
76,’DROP MATERIALIZED VIEW’,
79,’ALTER ROLE’,
81,’CREATE TYPE BODY’,
82,’ALTER TYPE BODY’,
83,’DROP TYPE BODY’,
85,’TRUNCATE TABLE’,
91,’CREATE FUNCTION’,
92,’ALTER FUNCTION’,
93,’DROP FUNCTION’,
94,’CREATE PACKAGE’,
95,’ALTER PACKAGE’,
96,’DROP PACKAGE’,
97,’CREATE PACKAGE BODY’,
98,’ALTER PACKAGE BODY’,
99,’DROP PACKAGE BODY’,
110,’CREATE PUBLIC SYNONYM’,
111,’DROP PUBLIC SYNONYM’,
112,’CREATE PUBLIC DATABASE LINK’,
113,’DROP PUBLIC DATABASE LINK’,
114,’GRANT ROLE’,
115,’REVOKE ROLE’,
116,’EXECUTE PROCEDURE’,’COMANDO DESCONHECIDO’) as “COMANDO”from sys.v_$session a, sys.v_$sqlarea b
where a.sql_address=b.address
and a.username = user20 de novembro de 2008 às 7:37 pm #83883rerodrig
ParticipanteValeu Litz! Mas não consegui capturar o fonte do objeto na trigger…nessa view “sys.v_$sqlarea” só deve mostrar consultas…já conseguiu alguma vez rastrear um comando do tipo create? Mesmo assim valeu!
20 de novembro de 2008 às 7:46 pm #83884Leonardo Litz
ParticipanteEntão, quando vc executar o create, ele ira aparecer na query, na coluna sql_text lá… certo… ai lá esta o body da trigger….
só que vc vai ter que desmembrar… ou então vc cria uma trigger de after e desmembra apenas o nome da trigger e vai lá na
sys.dbms_metadata.get_ddl(object_type => 😮 bject_type,
name => :name,
schema => :schema,
version => :version,
model => :model,
transform => :transform);passe os parametros que irá retornar um clob com o corpo do objeto.
Blz?
20 de novembro de 2008 às 8:00 pm #83885rerodrig
ParticipanteA trigger vai disparar antes ou depois de qualquer create no meu schema, se eu usar a dbms_metadata.get_ddl, não consigo pegar o fonte do objeto que rodou o create, porque ele ainda não foi “comitado” no oracle…por exemplo, se estou criando um objeto novo, o dbms_metadata.get_ddl, retorna que não existe o objeto no schema que passei nos parâmetros.
Nessa view não consegui pegar o fonte do objeto que estou criando…eu precisava de algo que pegasse o código fonte que está sendo executado naquele create que a trigger disparou, não sei se tem como…valeu!!!
20 de novembro de 2008 às 8:03 pm #83886Leonardo Litz
ParticipanteCara só tem como se vc desmembrar dessa coluna (sql_text)… não vejo outra forma….
20 de novembro de 2008 às 8:14 pm #83887rerodrig
ParticipanteO problema é que não consegui interceptar o comando de criação do objeto nessa view…mas blz, sem problemas…valeu aí pela ajuda! falow!!!
20 de novembro de 2008 às 10:05 pm #83888Rodrigo Mesquita
Participantevc ja tentou pesquisar a view User_Source?
20 de novembro de 2008 às 10:27 pm #83890Leonardo Litz
ParticipanteCara, andei pesquisando, pesquisando, pesquisando e achei….
da uma olhada se é isso que vc quer?
CREATE OR REPLACE TRIGGER TESTE AFTER CREATE ON DATABASE
DECLARE
V_SOURCE VARCHAR2(32767);
BEGINRAISE_APPLICATION_ERROR(-20001,DBMS_METADATA.get_ddl(object_type => sys.dictionary_obj_type,name => sys.dictionary_obj_name));
RAISE_APPLICATION_ERROR(-20001,’Objeto: ‘||sys.dictionary_obj_name||’ Tipo: ‘||sys.dictionary_obj_type||’ Owner: ‘||sys.dictionary_obj_owner);
END;
Valeu Leonardo Litz
20 de novembro de 2008 às 11:02 pm #83891rerodrig
Participante[quote=”Litz”:3rmw2c4u]…[/quote]
Litz, era isso que eu tava tentando, só que desse jeito, quando o objeto ainda não existe e está sendo criado, ele não encontra.
[quote=”RodrigoMesquita”:3rmw2c4u]vc ja tentou pesquisar a view User_Source?[/quote]
Rodrigo, na user_source, acontece a mesma coisa que eu disse acima(no exemplo do Litz).
Postei no fórum da Oracle e um dos usuário de lá respondeu o que eu estava precisando!
SQL> create or replace trigger before_create
2 before create on database
3 declare
4 sql_text ora_name_list_t;
5 n number;
6 begin
7 n := ora_sql_txt(sql_text);
8 for i in 1..n loop
9 dbms_output.put_line(sql_text(i));
10 end loop;
11 end;
12 /Isso retorna o código fonte do objeto quando ele está sendo criado. Eu tinha visto alguma coisa desse ora_sql_txt, mas não tinha dado certo, segui o exemplo que o cara postou e deu certo!
Obrigado aí pela ajuda de todos!
-
AutorPosts
- Você deve fazer login para responder a este tópico.