Impedir o insert de um registro via trigger sem raise

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Amigos,

Gostaria de saber se para raise la dentro do if teria alguma outra solução..
Quero impedir que o insert seja feito porem não quero exception gerada.. como fazer isso

Selecionar tudo

Create or Replace Trigger TR_IN_ITEM
Before Insert
on ITEM
For Each Row
Declare LTOTALITENS INTEGER;
LNOTA INTEGER;
Begin
-- Seleciona o código da nota que está sendo incluída.
LNOTA := :New.IDNOTA;
-- Totaliza a quantidade de itens já cadastrados na nota.
Select COUNT(*)
Into LTOTALITENS
From ITEM
Where IDNOTA = LNOTA;
-- Verifica se existem mais do que 30 itens na nota.
If (LTOTALITENS > 30) Then
Raise_Application_Error(-20000,'A nota ' || :New.IDNOTA || ' já
está cheia. Inclusão cancelada.');
End If;
End;
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Até onde eu saiba não tem como...

Gerar a exceção seria a solução ideal neste caso, tratando a exceção nas aplicações, escolhendo ignorar ou não o erro retornado.

Uma outra possibilidade seria criar uma view, e sobre ela criar uma trigger instead of insert, alterando as todas as referências à tabela para a view na sua aplicação...

Mas pela pergunta, acredito que no seu caso não seja possível alterar a aplicação.. neste caso, você poderia renomear a sua tabela, criar a view com o nome antigo da tabela, e criar as views instead of insert, update e delete, refletindo as devidas operações na tabela original.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

e Rafael..

esta solução eu havia pensado.. o que queria na verdade era substituir pontualmente o meu raise por algum outro comando..

mas agora que você ta garantindo q não tem jeito..

muito obrigado irmao

fica na paz
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Lembre-se que você pode colocar uma cláusula WHEN na criação da trigger:

Selecionar tudo

CREATE TRIGGER sua_trigger
AFTER INSERT on sua_tabela
FOR EACH ROW
WHEN ( NEW.LETTER_GEN_FLG != 'Y' )
begin 
  . 
  . 
  . 
:-o
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

grande thomas..

e olha q vi essa solução esses dias no forum porem esqueci..

isso vai resolver

VALEU
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ué.. não entendi muito bem agora..
Mesmo usando a cláusula WHEN na trigger, o insert ainda será realizado, a única diferença é que a trigger não será executada neste caso.. era isso mesmo o esperado?

Pelo que havia entendido o insert não deveria ser realizado..
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

e porque tem um porem..
eu ouvi por alta o problema real aqui e na verdade e um pouco mais simples
so tem um caso que não pode haver o raise então um desvio resolve..

:lol:

mas você tem razao..
realmente o que eu pensei que iria precisar era impedir o insert.. e o when não resolve.. so a instead of mesmo
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tem razão... O WHEN é para trigger, não para o insert.

:(
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes