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