Veja neste DevCast como implementar uma trigger que servirá de segunda camada de segurança no banco de dados e aprenda a garantir a segurança necessária para executar o comando update. Caso o seu código falhe ao proteger o aplicativo de um ataque por SQL Injection ou até mesmo de um update sem a instrução where, esse recurso nativo do banco de dados pode impedir que informações sejam perdidas.
Consulta rápida:
ALTER TRIGGER [dbo].[SafeUpdate] ON [prova].[dbo].[usuarios] FOR UPDATE
AS DECLARE
@PWD INT,
@ID INT
BEGIN
SET NOCOUNT ON
SELECT @PWD = pwd, @ID = id FROM inserted
IF(@ID IS NULL)
BEGIN
RAISERROR('%d nao e um dado valido', 16, 0, @PWD)
ROLLBACK TRANSACTION
RETURN
END
IF(@PWD <> 0x01010101 OR @PWD IS NULL)
BEGIN
RAISERROR('%d operacao nao permitida', 16, 0, @PWD)
ROLLBACK TRANSACTION
RETURN
END
UPDATE dbo.usuarios SET pwd = NULL WHERE id = @ID
END
Cria uma Trigger para o comando UPDATE.
As variáveis @PWD e @ID serão utilizadas para armazenar a senha e o ID do registro que será atualizado no banco, respectivamente.
Caso o ID não seja informado no comando UPDATE é lançado um erro seguido de um comando de ROLLBACKv e do encerramento da Trigger sem que nenhum registro seja de fato alterado.
Caso PWD não seja informado no comando UPDATE ou seja diferente daquela esperada pela Trigger, é lançado um erro seguido de um comando de ROLLBACK e do encerramento da Trigger sem que nenhum dado seja alterado.
Caso a atualização seja gravada no banco, após isso, o campo PWD da tabela retorna ao valor NULL através da última instrução UPDATE na Trigger. Por essa razão também utilizamos o comando SET NOCOUNT ON no início da Trigger, para que esse UPDATE não seja levado em consideração pelo banco de dados no momento de contabilizar o total de comandos executados com sucesso.
ALTER TRIGGER [dbo].[SafeUpdateWhere] ON [prova].[dbo].[usuarios] FOR UPDATE
AS DECLARE
@COUNT INT
BEGIN
SELECT @COUNT = COUNT(*) FROM inserted
IF(@COUNT > 1)
BEGIN
RAISERROR('%d operacao nao permitida', 16, 0, @COUNT)
ROLLBACK TRANSACTION
END
END
Declaramos a variável COUNT que será responsável por armazenar o total de linhas afetadas pelo comando UPDATE. Esse contador vem da tabela especial INSERTED do SQL Server.
Caso o total de linhas afetadas seja maior que um, lançamos um erro e solicitamos ROLLBACK para que nenhum registro seja de fato atualizado.