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
excellent response, very grateful for sharing your knowledge.
– Harry