AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 6880
Accepted
50LV3R
50LV3R
Asked: 2011-10-17 22:16:20 +0800 CST2011-10-17 22:16:20 +0800 CST 2011-10-17 22:16:20 +0800 CST

É possível ser notificado se um 'gatilho após inserção ou atualização' parar de funcionar?

  • 772

Na semana passada, descobri que o meu after insert or update triggernão estava funcionando. Depois que desabilitei e habilitei, voltou a funcionar.

Ainda não sei porque parou de funcionar. Existe alguma maneira de lidar com isso? Porque esse gatilho está registrando o valor dos trabalhos diários e é usado para fins de relatório. Se esse gatilho for desativado em alguns dias sem meu aviso ou erro, estarei em apuros.

Estou usando o Oracle 10g, acesse o db usando o sqldeveloper

My Trigger

create or replace
TRIGGER MASTER.INSTANCE_STEP_TRG 
AFTER INSERT OR UPDATE OF SYSID,STEP_ID,INSTANCE_ID,PARENT_STEP_ID ON MASTER.WF_INSTANCE_STEP 
REFERENCING OLD AS old NEW AS new 
FOR EACH ROW 
WHEN (new.sysid > 0) 
declare 
stepSysid number;
crCode varchar(50);
crDate date;
step_id number;
BEGIN
  step_id := :new.step_id;

  select ss.sysid into stepSysid from TEMPLATE.wf_step ws 
  inner join TEMPLATE.step_stage ss on ss.sysid=ws.stage_id
  where ws.sysid= step_id;


  if ( stepSysid>0) then
    insert into MASTER.fact_cr_progress values(0,:new.instance_id,stepSysid,:new.create_dt);
  end if;

  dbms_output.enable(10000);
  dbms_output.put_line('start print');

END;
oracle oracle-10g
  • 2 2 respostas
  • 1782 Views

2 respostas

  • Voted
  1. Best Answer
    Justin Cave
    2011-10-18T06:24:17+08:002011-10-18T06:24:17+08:00

    Um gatilho não pode simplesmente parar de funcionar.

    Um gatilho pode ser desabilitado. Um gatilho pode ser descartado. Um gatilho será invalidado se o DDL for feito para um dos objetos que ele referencia, mas ainda será executado se a instrução de disparo for executada. Se o gatilho não for recompilado com sucesso, a instrução de disparo receberá um erro

    ORA-04098: trigger ' MASTER.INSTANCE_STEP_TRG' is invalid and failed re-validation
    

    Também parece possível que o gatilho estivesse funcionando corretamente conforme declarado, mas não como você pretendia. Por exemplo, é possível que o new.sysid não seja maior que 0 (lembre-se que NULL não é maior que 0) fazendo com que a WHENcláusula não seja atendida. É possível que seu SELECTcomando tenha retornado um valor menor ou igual a 0, fazendo com que seu INSERTnão seja executado. Se TEMPLATE.wf_stepou TEMPLATE.step_stagetiver uma coluna STEP_ID, a WHEREcláusula

    where ws.sysid= step_id;
    

    interpretará STEP_IDcomo a coluna na tabela, não sua variável local STEP_ID. Uma das razões pelas quais os desenvolvedores PL/SQL geralmente adicionam prefixos às variáveis ​​locais (ou seja L_STEP_ID, em vez de STEP_ID) é evitar o uso inadvertido de um nome que também é usado por uma coluna em uma tabela porque esses tipos de problemas de resolução de escopo são notoriamente difíceis de depurar.

    • 7
  2. Joe
    2011-10-19T07:36:14+08:002011-10-19T07:36:14+08:00

    Provavelmente depende do motivo pelo qual o gatilho 'para de funcionar'.

    Se estiver sendo acionado, mas não for executado até o fim, você pode colocar algo para acionar uma mensagem no EXCEPTIONbloco.

    Se tiver sido desativado totalmente, você terá que encontrar alguma característica que seja verdadeira quando estiver em execução (por exemplo, tenho alguns gatilhos que preenchem um tipo de visualização materializada que é difícil de calcular em tempo real. Tenho um cron job que verifica para ver quando o registro mais recente nessa tabela é, e se for muito antigo, ele o reporta). Se você não tiver algo óbvio como isso, sempre poderá ter uma tabela que seja apenas para rastrear quando os gatilhos foram executados pela última vez e atualizá-la com a hora atual.

    Claro, nenhum deles realmente ajuda no caso que Justin Cave mencionou, onde os comandos estão sendo mal interpretados por causa da resolução do nome da variável. Você pode colocar um elsena if ( stepSysid>0)ramificação e colocar relatórios lá se for algo que nunca deveria acontecer.

    • 4

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve