Satisfazer condiçao para deletar registros em uma classe

12/09/2023

0

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

Responder

Posts

15/09/2023

Arthur Heinrich

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.
Responder

18/09/2023

Antonio Pazebao

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

Responder

19/09/2023

Arthur Heinrich

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 ;
Responder

19/09/2023

Arthur Heinrich

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 ;

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar