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  
)
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top