Estou curioso para saber se é possível criar uma tabela com uma coluna que nunca pode ser alterada, mas as outras colunas da tabela podem.
Por exemplo, eu poderia imaginar uma CreatedByUser
coluna que nunca deveria ser alterada.
Existe uma funcionalidade interna no SQL Server para isso, ou é possível apenas através de gatilhos ou outra coisa?
sql-server
Philipp M
fonte
fonte
Respostas:
Não há suporte declarativo embutido para colunas não atualizáveis (exceto casos específicos predefinidos, como
IDENTITY
)Este item do Connect solicitou, mas foi rejeitado. Adicione DRI para aplicar valores imutáveis da coluna
Um
UPDATE
gatilho provavelmente seria a maneira mais robusta de conseguir isso. Ele poderia verificarIF UPDATE(CreatedByUser)
e gerar um erro e reverter a transação, se verdadeira.fonte
Fiz minha implementação da
UPDATE TRIGGER
abordagem sugerida pela resposta de Martin Smith da seguinte maneira:(Nota: a tabela possui uma coluna Chave Primária, chamada ID).
Só rejeito a atualização se o valor de AssetTypeID for alterado. Portanto, a coluna pode estar presente em uma atualização e, se o valor não for alterado, ele passará. (Eu precisava desse jeito)
fonte
AssetTypeID
estiver definido como um valor não nulo e você executarUPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_id
que não haveria reversão, porqueWHERE i.AssetTypeID <> d.AssetTypeID
o gatilho seria avaliado como falso, deixando a coluna editável.Você pode usar uma visualização com coluna derivada. Tente isto
fonte
Por que você está atualizando a coluna createdby?
Eu teria duas colunas, uma coluna [created_by] e [modified_by], em que a primeira inserção inseria todas as colunas respectivas no registro, e quaisquer atualizações subsequentes apenas atualizariam a coluna [modified_by] (por meio de um gatilho no aplicativo camada, você pode estruturar sua atualização para alterar somente o [modified_by], juntamente com suas respectivas colunas)
fonte