TransWikia.com

Trigger que insere valor automático em um registro

Stack Overflow em Português Asked on September 27, 2021

Boa tarde, galera. tudo bem com vocês?
Estou tentando criar uma trigger que ao realizar um cadastro de parceiro ele marque automaticamente que o parceiro é cliente. No banco, esse campo é chamado de CLIENTE e recebe o valor ‘S’, porém, estou me deparando com o seguinte erro ao tentar cadastrar um parceiro :ORA-04098: gatilho ‘TESTE.AD_TRG_INC_UPD_TGFPAR’ é inválido e a revalidação falhou. Poderiam me ajudar?

CREATE OR REPLACE TRIGGER AD_TRG_INC_UPD_TGFPAR
BEFORE INSERT OR UPDATE OF CLIENTE ON TGFPAR
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW 
BEGIN
    IF :NEW.CLIENTE ='N' OR :NEW.CLIENTE IS NULL THEN 
       :NEW.CLIENTE := 'S';
END´´´

3 Answers

Boa tarde, Agradeço a ajuda. Consegui resolver graças aos conselhos de vocês. A query ficou assim.

BEFORE INSERT OR UPDATE ON TGFPAR
--REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW 
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; -- corrige mutante trigger
V_CLIENTE VARCHAR2(10);
BEGIN
SELECT user INTO V_CLIENTE
FROM DUAL;

:new.cliente:= 'S';
END;´´´ 

Answered by Pablo Dos Santos Neves on September 27, 2021

CREATE OR REPLACE TRIGGER AD_TRG_INC_UPD_TGFPAR
BEFORE INSERT OR UPDATE OF CLIENTE ON TGFPAR
FOR EACH ROW 
BEGIN
    IF TRIM(:NEW.CLIENTE) IS NULL THEN 
      :NEW.CLIENTE := 'S';
    END IF;
END;

Poderia também criar um DEFAULT na coluna

 ALTER TABLE TGFPAR
    MODIFY CLIENTE NOT NULL DEFAULT 'S';

Aplicando isto garantir não existir valores null

UPDATE TGFPAR SET CLIENTE NOT NULL DEFAULT 'S'
WHERE TRIM(CLIENTE) IS NULL; 

Answered by Motta on September 27, 2021

Acredito que você esteja fazendo confusão entre UPDATE e INSERT, no caso o campo já existe você quer altera-lo para 'S', no caso você tem que utilizar o UPDATE:

CREATE OR REPLACE TRIGGER AD_TRG_INC_UPD_TGFPAR
AFTER INSERT OR UPDATE OF CLIENTE ON TGFPAR
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW 
BEGIN
    IF :NEW.CLIENTE IS NULL THEN 
       :NEW.CLIENTE := 'S';
END

Outro erro que pode está dando é que sempre que você utilizar o :NEW ou :OLD o próximo valor depois do . (ponto) é o nome da coluna, verifique se realmente é o nome da coluna do valor que você deseja alterar.

Answered by Heitor Scalabrini on September 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP