Satisfazer condiçao para deletar registros em uma classe

MariaDB

12/09/2023

Boa noite pessoal!

Seguinte: tenho 2 classes sendo:
1 contas
1 itens_de_contas.

Na classe itens_de_contas, tenho um campo informando se o registro esta pendente de pagamento ou liquidado.

Problema:
Preciso que os registros lancados no itens_de_contas, sejam bloqueados para deleção caso houver um campo informando liquididado.

Exemplo:

No contas tenho um valor de 600,00 para pagamento em 3 parcelas.
Supondo-se que a primeira parcela no valor de 200,00 esteja com o campo status "LIQUIDADO" e o usuario por ventura resolva deletar o registro de contas e todos os lançamentos no itens_de_contas. Como fazer para bloquear essa exclusão?

Mais especificamente poderia ser assim, somente deletar tudo caso os registros do itens_de_contas fossem apenas "PENDENTES".


Att


Antonio Cesar
Antonio Pazebao

Antonio Pazebao

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

12/09/2023

A única maneira segura de garantir isto é utilizando uma trigger "before delete" no banco.

Ao executar um delete na tabela "contas", a trigger faria uma busca na tabela "itens_de_contas" em busca de 1 registro com status 'LIQUIDADO' ou diferente de 'PENDENTE'.

Se encontrar algum item, aborta a transação.

Você também pode implementar algo nas classes, para evitar o acesso ao banco, mas isso não garante que todos os pontos do seu sistema estarão utilizando a classe, nem mesmo que um usuário não fará a exclusão manualmente.
GOSTEI 0
Antonio Pazebao

Antonio Pazebao

12/09/2023

A única maneira segura de garantir isto é utilizando uma trigger "before delete" no banco.

Ao executar um delete na tabela "contas", a trigger faria uma busca na tabela "itens_de_contas" em busca de 1 registro com status 'LIQUIDADO' ou diferente de 'PENDENTE'.

Se encontrar algum item, aborta a transação.

Você também pode implementar algo nas classes, para evitar o acesso ao banco, mas isso não garante que todos os pontos do seu sistema estarão utilizando a classe, nem mesmo que um usuário não fará a exclusão manualmente.


Boa noite!! Como implemento essa triger ? ????

Att

Antonio

GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/09/2023

Imagino que seja algo mais ou menos assim:

DELIMITER $$

CREATE TRIGGER DeviceCatalog_PreventDeletion
BEFORE DELETE ON DeviceCatalog
FOR EACH ROW
BEGIN

  IF exists(select 1
            from itens_de_contas
            where
              itens_de_contas.conta_id = old.conta_id and
              itens_de_contas.status <> 'PENDENTE') THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Itens de conta não pendentes encontrados!';
    ROLLBACK;
  END IF;

END
$$

DELIMITER ;
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

12/09/2023

Errei o nome da tabela:

DELIMITER $$

CREATE TRIGGER contas_PreventDeletion
BEFORE DELETE ON contas
FOR EACH ROW
BEGIN

  IF exists(select 1
            from itens_de_contas
            where
              itens_de_contas.conta_id = old.conta_id and
              itens_de_contas.status <> 'PENDENTE') THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Itens de conta não pendentes encontrados!';
    ROLLBACK;
  END IF;

END
$$

DELIMITER ;

GOSTEI 0
POSTAR