Jump to content
caiquestevanatto

Trigger para gravação de LOG

Recommended Posts

Boa noite pessoal,

Sou novato no mundo Oracle e estou com dificuldades em criar uma trigger que toda vez que um produto for alterado, deverá criar um registro de LOG.

Criei a trigger abaixo porém não tenho certeza de que estar certa, pois esta apresentando a mensagem "2/48 PL/SQL: ORA-00984: coluna não permitida aqui" na linha os está AFTER UPDATE OR INSERT ON PRODUTO.

CREATE OR REPLACE TRIGGER CREATE_LOG
AFTER UPDATE OR INSERT ON PRODUTO
FOR EACH ROW
BEGIN 
INSERT INTO LOG VALUES (NEXTVAL,''02/10/2018'', "log criada" );
end;

Além disso, no insert, coloquei apenas uma data simbolica, pois tem que inserir a data atual e não faço ideia de como fazer isso.

Segue estrutura da tabela LOG:
IDLOG NUMBER(38,0)
DATA DATE
DESCRICAO VARCHAR2(255 BYTE)

podem me ajudar por favor ?

Share this post


Link to post
Share on other sites

Para o nextval pesquise por SEQUENCE.

 

No log faria sentido gravar a data corrente , pesquise por sysdate.

 

A operação feita é que deveria ser gravada.

Share this post


Link to post
Share on other sites

Obrigado mais uma vez Motta!

 

Criei a trigger abaixo, porém gostaria de incrementar ela, onde na descrição, além de informar o ID (como já está informando), informar também qual campo foi alterado, como por exemplo, a quantidade.

Ficaria mais ou menos assim:

3  |  17/10/18  |  Produto 4 alterado a quantidade 

 

CREATE OR REPLACE TRIGGER CREATE_LOG
AFTER UPDATE OR INSERT ON PRODUTO
FOR EACH ROW
BEGIN 
INSERT INTO LOG VALUES (IDLOG.NEXTVAL,SYSDATE, 'Produto ' || cast(:NEW.IDPRODUTO as varchar(10)) || ' alterado' );
end;

 

é possível ?

Share this post


Link to post
Share on other sites

Dica você os valores :old e :new , basta compará-los.

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By mzaidan
      Pessoal, estou meio enferrujado, voltando depois de alguns anos sem mexer em nada.
      Queria uma pequena ajuda, se possível.
       
      Seguinte:
      Tenho uma tabela com nome e faixa do cara (jiu jitsu).
      Por exemplo:
      Nome     | Faixa
      AlunoA   | branca
      AlunoB   | branca
      AlunoC   | azul
      AlunoD   | azul
      AlunoE   | marrom
      AlunoF   | roxa
      AlunoG   | preta
       
      Queria fazer um sql (na verdade vou usar em php), que me retornasse assim:
       
      Faixa Branca:
      AlunoA
      AlunoB
      Faixa Azul:
      AlunoC
      AlunoD
      Faixa Roxa:
      AlunoF
      Faixa Marrom:
      AlunoE
      Faixa Preta:
      AlunoG
       
      O que eu poderia fazer??
       
      Desde já agradeço.
    • By RAFAEL C D EMELO
      Bom dia amigos,
       
      me deparei com um problema estou criando uma procedure que precisa criar uma PK em uma tabela ja existente e apos isso realizar um insert porem quando existe um dado duplicado por algum motive a exception DUP_VAL_ON_INDEX NAO FUNCIONA  o insert funcionou mas quando testo uma situacao de duplicacao eu recebo um erro oracle 02260 e diz que a tabela somente pode ter uma PK porem a exception deveria tartar o erro ,
      eu vou deixar o codigo a baixo par se alguem puder me ajudar isso
      desde ja agradeco a todos,
       
      CREATE OR REPLACE PROCEDURE MANUAL_CLIENT_INSERT_FIP AS
      Y_CONT NUMBER := 0;
      W_CONT NUMBER;
          BEGIN 
           
           EXECUTE IMMEDIATE 'ALTER TABLE TEMP_FIP_CLIENT_HISTORIC
                              ADD PRIMARY KEY (CLIENTKEY)';
           
              FOR REG IN (SELECT LOADDATE,
                          CLIENTKEY,
                          CLIENTSEGMENT,
                          CLIENTNAME,
                          'UK' AS COUNTRY,
                          'FIP' AS PROGRAM,
                          'TPL' AS COVERAGE
              FROM TEMP_FIP_CLIENT_HISTORIC
      )
       LOOP
       
        BEGIN
          W_CONT := NVL(W_CONT, 0)+ 1;
                
           DBMS_OUTPUT.PUT_LINE('RECORDS' ||'-'|| W_CONT ||' '||REG.LOADDATE||' '||REG.CLIENTKEY||' '||REG.CLIENTSEGMENT||' '|| REG.CLIENTNAME||' '||'UK'||' '||'FIP'||' '||'TPL');
                                                
            INSERT INTO GV_MANUAL_CLIENT(LOADDATE, CLIENTKEY,  CLIENTSEGMENT,   CLIENTNAME,  COUNTRY,  PROGRAM,  COVERAGE )
            VALUES                      (SYSDATE,  REG.CLIENTKEY, REG.CLIENTSEGMENT, REG.CLIENTNAME, REG.COUNTRY, REG.PROGRAM, REG.COVERAGE);
         
         
         EXCEPTION
               WHEN DUP_VAL_ON_INDEX THEN
               DBMS_OUTPUT.PUT_LINE(W_CONT ||'  '||'DUPLICATE KEY');  
          END; 
         
       END LOOP;
      END;
    • By matlaureto
      Pessoal, boa tarde!!!
      Gostaria de uma opinião de vocês... sempre trabalhei no Oracle utilizando left join, inner join, e não a marcação de join especifica da oracle (+).
      Quando estudei para a certificação 1Z0-047, OCE SQL Expert, lá mesmo falava para não utilizar a marcação (+) por se tratar de um código depreciado.
      Alguem sabe informar se essa marcação realmente é depreciada? Estou trabalhando em uma empresa onde o padrão dos joins é com esta marcação da Oracle, então to buscando informações sobre isso.
      Alguem sabe me orientar quanto a isso?
      Muito obrigado a todos!!
    • By Dinho Nunes LC
      <div align="center" id="subtitulo"> Canais Abertos </div> <div class="ui cards"> <div class="card"> <div class="content"> <a href="globo.html" style="display: block; color: black"> <div align="center"> <div> <img class="ui tiny image" id="imagem_card_casa" src="assets/images/Rede_Globo_2014.png"> <div align="center" id = "nome_time_fora"> <b>Globo RJ</b> </div> </div> Onde "globo.html" seria substituído pelo link que esta em uma tabela do banco de dados.
       
      Já fiz a conexão. E tenho a base de dados pronta.
       
      Motivo pelo qual estou buscando ajuda:
       
      Faço manualmente a mudança de cada link (são mais de 300) diariamente para evitar copias de terceiros. Sendo assim poderia usar um CRUD para facilitar a troca dos links direto no banco de dados.
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.