Pular para o conteúdo
  • Este tópico contém 12 respostas, 3 vozes e foi atualizado pela última vez 18 anos, 9 meses atrás por Marcio68Almeida.
Visualizando 13 posts - 1 até 13 (de 13 do total)
  • Autor
    Posts
  • #79582
    djdigao
    Participante

      Boa tarde pessoal, alguem sabe me dizer qual seria a tabela equivalente no oracle a tabela inserted do SQL Server. Valeu pessoal agradeço a todos desde já 🙂

      #79583
      Marcio68Almeida
      Participante

        diga o que faz uma tabela inserted no SQL Server que facilitaria bastante a nossa ajuda…

        #79584
        djdigao
        Participante

          A tabela inserted faz o seguinte, toda vez que vc faz um update ou insert os dados vão primeiramente para esta tabela inserted e depois para a tabela real de destino e tambem tem a deleted que armazena dos dados antes deles serem apagados, a minha idéia e pegar os dados com uma trigger antes deles serem atualizados e deletados, quero fazer tipo uma auditoria em algumas tabelas.

          #79586
          Marcio68Almeida
          Participante

            Ah, entendi…
            Dentro da trigger você encontrará a opção :NEW.coluna e :OLD.coluna onde estão as informações atualizadas (:NEW) e as anteriores (:OLD)
            Creio que é isso que você quer…

            #79591
            djdigao
            Participante

              Legal, entendi o esquema então.
              Agora deixa eu aproveitar e ver com vc o seguinte: Existe varáveis do Oracle que me retorne o Usuário da que esta logado na estação? Eu gostaria de pegar o usuario da estação e a máquina que ele esta logado no momento.

              #79592
              Marcio68Almeida
              Participante

                Tente este script :

                CREATE OR REPLACE TRIGGER marca_logon
                AFTER LOGON ON DATABASE
                BEGIN
                INSERT INTO sys.vigia
                VALUES (USER || ' entrou no sistema em ' ||
                TO_CHAR(sysdate, 'DD-MM-YYYY HH24:MI:SS') ||
                ' pelo terminal ' || userenv('terminal') );
                COMMIT;
                END;
                /

                #79593
                djdigao
                Participante


                  create or replace TRIGGER "USUARIO_SYS"."INSERIR_AUDIT"
                  BEFORE INSERT ON "TESTE"
                  FOR EACH ROW
                  DECLARE
                  VAR_DATA DATE:=SYSDATE;
                  VAR_ORIGEM VARCHAR(4000);
                  VAR_TABELA VARCHAR(4000);
                  VAR_REGISTRO VARCHAR(4000):= TO_CHAR(:NEW.HORA);
                  BEGIN
                  SELECT 'Usuário da estação:' || sys_context('USERENV', 'OS_USER') || ' - ' || 'Estação:' || sys_context('USERENV', 'HOST') || ' - ' || 'IP da estação:' || sys_context('USERENV', 'IP_ADDRESS') INTO VAR_ORIGEM FROM dual;
                  INSERT INTO RECIVIL_AUDIT
                  VALUES(VAR_DATA, 1, VAR_ORIGEM, 'TESTE', VAR_REGISTRO, 'INSERT');
                  END;

                  Esse é o meu código, o que eu queria fazer tb era pegar o nome da tabela que eu estou usando a trigger com algum código PL/SQL, ja consegui pegar tudo esta faltando o nome da tabela, ah, e tb eu gostaria de saber se tem como referenciar todos os campos no comando :NEW, eu queria pegar todos os campos da tabela de uma só vez, é possível? Ja tentei :NEW.*, mais não deu certo

                  #79594
                  Marcio68Almeida
                  Participante

                    A trigger deve ser inserida em cada tabela, não dá para fazer uma trigger genérica para esse trabalho…
                    Portanto…
                    O nome da tabela você vai ter, já que é nela que a trigger está…
                    O nome das colunas devem ser tratados individualmente, não com *
                    Se você tinha a ilusão de “registrar” todas as mudanças em todas as tabelas, todas as colunas, acho melhor você repensar, pois isso, dependendo do tamanho das suas tabelas, é inviável.
                    Comandos de lote como TRUNC e LOAD não “disparam” a trigger…

                    #79595
                    djdigao
                    Participante

                      Certo, muito obrigado Marcio me ajudou bastante mesmo. 😀

                      #79628
                      JamirJr
                      Participante

                        Achei muito interessante esta trigger:

                        create or replace trigger catch_error
                        after servererror on database

                        dá uma olhada:

                        http://mportes.blogspot.com/2006/01/tri … error.html

                        #79638
                        djdigao
                        Participante

                          Bom dia pessal!
                          Essa variavel TG_OP existe no PL/SQL do oracle 10g ? Ela retorna o tipo de instrução que fui executada na trigger, tipo se foi um INSERT, UPDATE ou DELETE.
                          Se ela não exitir qual devo utilizar?

                          #79688
                          JamirJr
                          Participante

                            não encontrei esta variavel TG_OP,

                            mas vc pode fazer uma varredura no campo string e verificar se existe a palavra “select” ou por qualquer outra que vc queira fazer um filtro.

                            #79689
                            Marcio68Almeida
                            Participante

                              [quote=”djdigao”:1ppbq6do]Bom dia pessal!
                              Essa variavel TG_OP existe no PL/SQL do oracle 10g ? Ela retorna o tipo de instrução que fui executada na trigger, tipo se foi um INSERT, UPDATE ou DELETE.
                              Se ela não exitir qual devo utilizar?[/quote]

                              IF ( updating OR inserting ) THEN
                              :new.ic_envio := '1';
                              END IF;

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