Satisfazer condiçao para deletar registros em uma classe
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
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
Curtidas 0
Respostas
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.
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
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.
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
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
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