Estou curioso 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 só é possível por meio de gatilhos ou outra coisa?
Não há suporte declarativo integrado para colunas não atualizáveis (exceto para casos predefinidos específicos, como
IDENTITY
)Este item do Connect solicitou, mas foi rejeitado. Adicionar DRI para aplicar valores de coluna imutáveis
Um
UPDATE
gatilho provavelmente seria a maneira mais robusta de conseguir isso. Ele pode verificarIF UPDATE(CreatedByUser)
e gerar um erro e reverter a transação se for verdadeiro.Fiz minha implementação da
UPDATE TRIGGER
abordagem sugerida pela resposta de Martin Smith da seguinte forma:(Nota: A tabela tem uma coluna de Chave Primária, chamada ID).
Só estou rejeitando a atualização se o valor de AssetTypeID mudar. Portanto, a coluna pode estar presente em uma atualização e, se o valor não for alterado, ela passará. (eu precisava assim)
Você pode usar uma exibição com coluna derivada. Tente isso
Eu sei que isso é bastante antigo, mas existe uma maneira de impedir que uma coluna seja ATUALIZADA, razão pela qual o SQL não precisa de um esquema imutável e é a mesma razão pela qual o Microsoft SQL Server nunca atendeu à solicitação vinculada por @Martin Smith na resposta.
A linha a seguir impedirá que sua tabela seja atualizada ou alterada de qualquer maneira.
Você pode conceder todas as permissões em todos os bancos de dados e tabelas, mas mantenha "INSERT" somente onde precisar de uma tabela pseudo-imutável. Espero que isto ajude.
Por que você está atualizando a coluna createdby?
Eu teria duas colunas uma coluna [created_by] e uma [modified_by], onde a primeira inserção inseriria todas as respectivas colunas no registro, e qualquer atualização subsequente apenas atualizaria a coluna [modified_by] ( por meio de um gatilho no aplicativo camada, você pode estruturar sua atualização para alterar apenas o [modified_by] , junto com suas respectivas colunas)