Criando um Log usando TRIGGER (Gatilho) no SQL SERVER

Para criar um log de alterações de uma tabela, podemos utilizar uma trigger, também chamado de gatilho. Ao ser feito uma alteração ou um delete em uma tabela ela cria uma espécie de tupla virtual no momento da execução chamada INSERTED e/ou DELETED. No caso de UPDATE teremos os dois.



Primeiro vamos criar uma tabela para salvar os logs. Podemos utilizar a SQL abaixo:


USE [minhaBaseDeDados]
 GO
 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO
 SET ANSI_PADDING ON
 GO
 CREATE TABLE [dbo].[logusuario](
      [codigo] [int] IDENTITY(1,1) NOT NULL,
      [codusuario] [varchar](20) NOT NULL,
      [nome] [varchar](50) NOT NULL,
      [alterado_por] [varchar](20) NOT NULL,
      [alterado_em] [datetime] NOT NULL,
  CONSTRAINT [PK_logusuario] PRIMARY KEY CLUSTERED
 (
      [codigo] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 ) ON [PRIMARY]
 GO
 SET ANSI_PADDING OFF
 GO


Com esse comando SQL, criaremos a tabela logusuario com as colunas: codigo, codusuario, nome, alterado_por e alterado_em.

Agora iremos criar a Trigger.


USE [minhaBaseDeDados]
 GO
 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO
 CREATE TRIGGER [dbo].[LOGGUSUARIO] ON [dbo].[GUSUARIO] FOR update AS
 BEGIN
 DECLARE @codusuario varchar(30);
 select @codusuario = INSERTED.CODUSUARIO from inserted;
 IF UPDATE(senha)
     BEGIN
       INSERT
       INTO
         logusuario
         (
           codusuario,
           nome,
           alterado_por,
           alterado_em
         )
         (
           SELECT
             top 1
             GUSUARIO.CODUSUARIO,
             GUSUARIO.NOME,
             GUSUARIO.RECMODIFIEDBY,
             GUSUARIO.RECMODIFIEDON
           FROM
             dbo.GUSUARIO
           WHERE
             GUSUARIO.CODUSUARIO = @codusuario
           )
     END      
 END


Essa trigger será criada na tabela GUSUARIO que no meu caso é onde estão salvos os usuários. Ela será executada quando for executado uma alteração em algum cadastro de usuário. A linha onde está escrito "FOR update" indica que uma ação será executada quando for feito um update na tabela.

Quando a ação é um update, o banco de dados faz um delete e depois um insert. Por isso na trigger teremos a tupla DELETED e INSERTED.

A linha  "select @codusuario = INSERTED.CODUSUARIO from inserted;", armazena na variável @codusuario, o código do usuário que está sendo alterado.

Na próxima linha temos um IF que verifica se o campo senha está sendo alterado e faz o insert se o usuário está alterando a senha.

O insert feito está utilizando um select. No meu caso o sistema salva o último usuário que alterou a linha no campo RECMODIFIEDBY e salva a data da última modificação em RECMODIFIEDON. Assim em próximas alterações teremos todos os usuários que alteraram senha na outra tabela, a logusuario.

É isso. Até mais.




Nenhum comentário:

Postar um comentário