Bloquear update sem where
14/12/2016
0
Calebe Menezes
Post mais votado
14/12/2016
Não é a forma mais bonita de ser resolver eu acho, mas o que você pode fazer é criar um Trigger.
Você pode:
1. Procurar na clausula a palavra 'WHERE'. Seria algo tipo:
CREATE TRIGGER My_Trigger ON MyTable FOR UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @SQLBuffer nvarchar(4000) DECLARE @buffer TABLE ( EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000) ) INSERT @buffer EXEC sp_executesql N'DBCC INPUTBUFFER(@@spid) WITH NO_INFOMSGS' SELECT @SQLBuffer = EventInfo FROM @buffer IF @SQLBuffer NOT LIKE '%WHERE%' BEGIN RAISERROR('Comando sem WHERE',16,1) ROLLBACK END END
2.Comparar se o número de linhas afetadas é igual ao número de linhas da tabela que você está tentando fazer o update, se for, bloquear o comando. Seria algo tipo:
CREATE TRIGGER My_trigger ON MyTable FOR UPDATE AS BEGIN DECLARE @Count int SET @Count = @@ROWCOUNT; IF @Count >= (SELECT SUM(row_count) FROM sys.dm_db_partition_stats WHERE OBJECT_ID = OBJECT_ID('MyTable' ) AND index_id = 1) BEGIN RAISERROR('Cannot update all rows',16,1) ROLLBACK TRANSACTION RETURN; END END GO
Aline Bianchini
Mais Posts
14/12/2016
Mariana Carvalho
A outra maneira, é mais conhecida, conscientização, ter uma politica de backup.
14/12/2016
Mariana Carvalho
Aline, você que fez essa trigger? fora a questão que escreveu, existe algum problema em usa-la?
14/12/2016
David Styveen
Deixar a consulta implícita de transação não resolveria? Dessa forma, todo comando executado deve confirmar a transação.
15/12/2016
Fabio Parreira
Funciona muito bem, uso ele na produção.
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[NOMEDATRIGGER_COMANDO_INVALIDO] ON [dbo].[SUATABELA] FOR UPDATE,DELETE AS BEGIN DECLARE @Count int SET @Count = @@ROWCOUNT; IF @Count >= (SELECT sum(rowcnt) FROM sysindexes WHERE ID = OBJECT_ID('dbo.SUATABELA' )) BEGIN RAISERROR('Comando inválido',16,1) ROLLBACK TRANSACTION RETURN; END END
19/12/2016
Calebe Menezes
Realmente minha intenção é deixar alguma coisa "programática" já fazendo o impedimento da execução desse tipo de query.
É claro que além disso o pessoal é alertado para tomar cuidado quando executar suas queries rs.
Acho que a solução do trigger seria a melhor para esse meu caso.
Obrigado a todos pelas dicas!
05/01/2017
David Styveen
Fim de ano corrido.
Em Ferramentas > Opções > Execução de Consulta > SQL Server > ANSI > marcar a opção SET IMPLICIT_TRANSACTIONS
Essa opção irá abrir uma transação para qualquer comando DML, sendo assim necessário sua confirmação após executar o comando.
Essa opção ajuda a minimizar as ocorrências de comandos sem where, porém não os impede.
O problema dessa solução, é que deverá ser configurada em cada instalação do SQL Server Management Studio. Portanto, ela não impede, por exemplo, que um comando enviado por um aplicação faça o update ou delete sem where.
Fica a dica para conhecimento.
Abraços.
11/01/2017
Calebe Menezes
Show de bola mano! Grande colaboração!
Clique aqui para fazer login e interagir na Comunidade :)