What is the best way to do these Triggers?

0

I wonder if there is a better way to write these triggers. I 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
    
asked by anonymous 16.06.2015 / 03:13

1 answer

3

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

  • The first trigger is intended, when a new user is inserted into the TB_USUARIO table, to update the EXCLUIR_CADASTRO column with the value 'N' and the DATA_CADASTRO column with the system date. This can be done in the same statement as INSERT , so it is not necessary to create a trigger. Just 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 is intended, when a user is removed, to update the EXCLUIR_CADASTRO, DATA_EXCLUSAO e DATA_CADASTRO columns. Again, this behavior could be obtained when executing the UPDATE statement and without resorting to a trigger. It would look equivalent:
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, just for the sake of completing the answer and answering your initial question, you can create a slightly more general trigger to handle the two cases. To access the values that have been inserted or updated you must use the inserted or deleted logical tables.

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
    
16.06.2015 / 12:31