What’s the best way to do these triggers?

Asked

Viewed 171 times

0

I wonder if there is a better way to write these Rigger. thank you

--gatilho para gravar os dados do usuário 
CREATE TRIGGER TGR_TB_USUARIO_INSERT
 ON TB_USUARIO
 FOR INSERT
AS
BEGIN
   DECLARE @IDUSUARIO INT
   SELECT @IDUSUARIO = IDUSUARIO FROM TB_USUARIO
   UPDATE TB_USUARIO SET  EXCLUIR_CADASTRO = 'N', DATA_CADASTRO = CONVERT(VARCHAR, GETDATE(), 20) WHERE IDUSUARIO = @IDUSUARIO
END
GO

--gatilho para exclusão dos dados do usuário 
CREATE TRIGGER TGR_TB_USUARIO_UPDATE
 ON TB_USUARIO
 FOR UPDATE
AS
BEGIN
   DECLARE @EXCLUIR CHAR(1)
   DECLARE @IDUSUARIO INT
   SELECT @EXCLUIR = EXCLUIR_CADASTRO, @IDUSUARIO = IDUSUARIO FROM TB_USUARIO 

   IF (@EXCLUIR = 'S')
     BEGIN
      UPDATE TB_USUARIO SET  EXCLUIR_CADASTRO = 'S', DATA_EXCLUSAO = CONVERT(VARCHAR, GETDATE(), 20), DATA_CADASTRO = NULL WHERE IDUSUARIO = @IDUSUARIO
     END

     IF (@EXCLUIR = 'N')
     BEGIN
      UPDATE TB_USUARIO SET  EXCLUIR_CADASTRO = 'N', DATA_CADASTRO = CONVERT(VARCHAR, GETDATE(), 20), DATA_EXCLUSAO = NULL WHERE IDUSUARIO = @IDUSUARIO
     END   

END
GO

1 answer

3


First of all, some comments on your implementation. In my opinion none of the cases justifies the use of a Trigger.

  • The first Trigger aims, when a new user is inserted into the table TB_USUARIO, update the column EXCLUIR_CADASTRO value 'N' and column DATA_CADASTRO with the system date. This can be done in the same instruction of INSERT, there is no need to create a Rigger. Simply do:
INSERT INTO TB_USUARIO(id, username, excluir_cadastro, data_cadastro)
VALUES(123, 'NomeUtilizador', 'N', GETDATE()) -- Por defeito, quando o utilizador é inserido a flag fica com valor 'N' e a DATA_CADASTRO é a data do sistema
  • The second Trigger aims, when a user is removed, to update the columns EXCLUIR_CADASTRO, DATA_EXCLUSAO e DATA_CADASTRO. Once again, this behaviour could be obtained when carrying out the instruction of UPDATE and without resorting to a Rigger. It would be, in an equivalent way:
UPDATE TB_USUARIO
   SET  EXCLUIR_CADASTRO = @excluirCadastro, 
       ,DATA_CADASTRO = CASE WHEN @excluirCadastro = 'N' THEN GETDATE() ELSE NULL END -- Porque actualizar a data de cadastro quando actualizas o utilizador? Não seria mais correcto ter uma coluna DATA_DE_ALTERACAO?
       ,DATA_EXCLUSAO = CASE WHEN @excluirCadastro = 'S' THEN GETDATE() ELSE NULL END 
  WHERE IDUSUARIO = @idUsuario

Finally, and just for the sake of completing the answer and answering your initial question, you can create a more generic Rigger to handle both cases. To access the values that have been inserted or updated you must use the logical tables inserted or Deleted.

CREATE TRIGGER TGR_TB_USUARIO ON TB_USUARIO AFTER INSERT, UPDATE AS

   DECLARE @action CHAR(1) = ' '

   IF EXISTS (SELECT * FROM inserted)
      SET @action = CASE WHEN EXISTS(SELECT * FROM deleted) THEN 'U' ELSE 'I' END; -- Se existir um registo nas duas tabelas então trata-se de um update, caso apenas exista na tabela inserted então é um insert
   ELSE RETURN; 

   UPDATE TB_U 
      SET  TB_U.EXCLUIR_CADASTRO = CASE 
                                      WHEN @action = 'I' THEN 'N' -- Inserir novo utilizador, acção: Actualizar excluir_cadastro com valor 'N'
                                      WHEN @action = 'U' THEN tb.excluir_cadastro  -- actualizar utlizador, acção: NADA
                                   END 
          ,TB_U.DATA_CADASTRO = CASE 
                                     WHEN @action = 'U' AND inserted.EXCLUIR_CADASTRO = 'S' THEN NULL --Actualizar utilizador (excluir) acção: actualizar data_cadastro para NULL
                                     ELSE GETDATE() --Inserir novo utilizador ou actualizar, acção: Actualizar data_cadastro com data do sistema
                                END
          ,TB_U.DATA_EXCLUSAO = CASE WHEN inserted.EXCLUIR_CADASTRO = 'S' THEN GETDATE() ELSE NULL END  
     FROM TB_USUARIO TB_U
     INNER JOIN inserted
       ON inserted.IDUSUARIO = TB_U.IDUSUARIO  -- Assumindo que IDUSUARIO é chave primária na tabela TB_USUARIO
END
GO
  • 1

    excellent response, very grateful for sharing your knowledge.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.