Dica - Protegendo usuário de fazer update sem where

SQL

MySQL

19/01/2021

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

Curtidas 0
POSTAR