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.

Confira também