Dica - Protegendo usuário de fazer update sem where

19/01/2021

0

Esse post é uma dica e não uma pergunta!

Caso de uso: Uma empresa possui mais de um usuário de banco de dados que possui permissão de realizar update em uma ou mais tabelas e para tal deseja impedir que update sem a cláusula WHERE sejam executados. (Acreditem ou não isso é mais comum do que imaginam).

Para fazer é bastante simples, ainda há como melhorar e não é a única maneira de se fazer. Portanto sugestões são sempre bem-vindas. Caso alguém saiba como restringir para um ou mais usuários específicos comentem em seguida.

A trigger ficou da seguinte forma:

DROP TRIGGER Valida_update_nome_sua_tabela;

DELIMITER $$

CREATE TRIGGER Valida_update_nome_sua_tabela BEFORE UPDATE
ON sua_tabela FOR EACH ROW
BEGIN
   IF
   (SELECT
      INFO
   FROM
      INFORMATION_SCHEMA.PROCESSLIST
   WHERE DB = SCHEMA()
      AND id = CONNECTION_ID()) NOT LIKE '%WHERE%'
   THEN SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Não é possível executar um update sem WHERE. Verifique seu update e corrija-o';
   END IF;
END $$

DELIMITER;


Ao realizar um update a trigger é acionada ANTES do update ser completado e valida na listagem de processos se a query executada possui a cláusula where. O processo é obtido de acordo com o banco que está sendo usado com a função SCHEMA() e com o processo que acionou o update CONNECTION_ID(). Caso o update não possua a mensagem é exibida, caso deseje outra mensagem basta alterar.

O detalhe principal é que essa trigger DEVE ser cadastrada para cada tabela que deseja utilizar. Por isso altere o nome da trigger e na parte "nome_sua_tabela" coloque o nome respectivo da tabela que deseja cadastrar a trigger.

Sugiro realizar TESTES em ambiente de homologação ANTES de usar em ambiente de produção.
Chromusmaster

Chromusmaster

Responder

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

Aceitar