Pular para o conteúdo
  • Este tópico contém 18 respostas, 5 vozes e foi atualizado pela última vez 17 anos atrás por Avatar photoLeonardo Litz.
Visualizando 15 posts - 1 até 15 (de 19 do total)
  • Autor
    Posts
  • #83875
    rerodrig
    Participante

      Quando 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!!!

      #83876
      Marcio68Almeida
      Participante

        Você 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…

        #83877
        rerodrig
        Participante

          Então, não é isso, eu preciso pegar o código dos objetos.

          #83878
          Avatar photoLeonardo Litz
          Participante

            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

            #83880
            hermesmc
            Participante

              Talves esse artigo possa te ajudar: http://www.linhadecodigo.com.br/Artigo.aspx?id=621

              #83881
              rerodrig
              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!

                #83882
                Avatar photoLeonardo Litz
                Participante

                  Desculpe, 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 = user

                  #83883
                  rerodrig
                  Participante

                    Valeu 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!

                    #83884
                    Avatar photoLeonardo Litz
                    Participante

                      Entã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?

                      #83885
                      rerodrig
                      Participante

                        A 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!!!

                        #83886
                        Avatar photoLeonardo Litz
                        Participante

                          Cara só tem como se vc desmembrar dessa coluna (sql_text)… não vejo outra forma….

                          #83887
                          rerodrig
                          Participante

                            O problema é que não consegui interceptar o comando de criação do objeto nessa view…mas blz, sem problemas…valeu aí pela ajuda! falow!!!

                            #83888
                            Rodrigo Mesquita
                            Participante

                              vc ja tentou pesquisar a view User_Source?

                              #83890
                              Avatar photoLeonardo Litz
                              Participante

                                Cara, 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);
                                BEGIN

                                RAISE_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

                                #83891
                                rerodrig
                                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!

                                Visualizando 15 posts - 1 até 15 (de 19 do total)
                                • Você deve fazer login para responder a este tópico.