Coluna DateTime atualizada automaticamente do SQL Server 2005 - LastUpdated
-
09-06-2019 - |
Pergunta
Tenho uma tabela definida (veja trecho de código abaixo).Como posso adicionar uma restrição ou qualquer outra coisa para que a coluna LastUpdate seja atualizada automaticamente sempre que a linha for alterada?
CREATE TABLE dbo.Profiles
(
UserName varchar(100) NOT NULL,
LastUpdate datetime NOT NULL CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
FullName varchar(50) NOT NULL,
Birthdate smalldatetime NULL,
PageSize int NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE
)
Solução
Uma restrição padrão funciona apenas em inserções;para uma atualização, use um gatilho.
Outras dicas
Concordo com os outros - defina um valor padrão GetDate() na coluna LastUpdate e use um gatilho para lidar com quaisquer atualizações.
Apenas algo simples como isto:
CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS
UPDATE dbo.Profiles
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)
Se você quiser ser realmente sofisticado, avalie o que está sendo alterado em relação ao que está no banco de dados e modifique o LastUpdate apenas se houver alguma diferença.
Considere isto...
7 da manhã - O usuário 'jsmith' é criado com o sobrenome 'Smithe' (ops), o padrão do LastUpdate é 7h
8 horas da manhã - 'jsmith' envia um e-mail para TI dizendo que seu nome está incorreto.Você executa a atualização imediatamente, então o sobrenome agora é 'Smith' e (graças ao gatilho) LastUpdate mostra 8h
14h - Seu colega de trabalho mais preguiçoso finalmente fica entediado com o StumbleUpon e verifica seu e-mail.Ele vê a mensagem anterior de 'jsmith' sobre a mudança de nome.Ele corre: UPDATE Perfis SET Sobrenome='Smith' WHERE Nome de usuário='jsmith' E depois volta a surfar no MySpace.O gatilho não se importa que o sobrenome já seja 'Smith', portanto, LastUpdate agora mostra 14h.
Se você alterar cegamente o LastUpdate sempre que uma instrução de atualização for executada, é TECNICAMENTE correto porque uma atualização aconteceu, mas provavelmente faz mais sentido comparar as alterações e agir de acordo.Dessa forma, a declaração de atualização das 14h do colega de trabalho ainda seria executada, mas o LastUpdate ainda mostraria 8h.
--Kevin
Concordo com a ideia do gatilho, embora eu usasse uma junção inserida em vez de uma subconsulta.No entanto, quero salientar que o nome de usuário é uma escolha particularmente ruim para uma chave primária.Os nomes de usuário mudam frequentemente e quando isso acontece, você precisa alterar todas as tabelas relacionadas.É muito melhor ter um ID de usuário como chave e depois colocar um índice exclusivo no nome de usuário.Então, quando o nome de usuário for alterado, você não precisará alterar mais nada.
Você terá que usar gatilhos para isso.
Minha sugestão seria criar um procedimento armazenado cujo padrão lastUpdate seja getdate ().
Eu tentei evitar gatilhos no passado porque localizá-los e editá-los antes do SQL2005 era uma dor de cabeça.Especialmente para desenvolvedores que são novos no seu projeto.
Adicione também isso como o valor padrão para sua definição de coluna.