Dica - Protegendo usuário de fazer update sem where
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:
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.
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
Curtidas 0