Je suis curieux de savoir s'il est possible de créer une table avec une colonne qui ne peut jamais être modifiée, mais les autres colonnes de la table le peuvent.
Par exemple, je pourrais imaginer une CreatedByUser
colonne qui ne devrait jamais être modifiée.
Y a-t-il une fonctionnalité intégrée dans SQL Server pour cela, ou est-ce uniquement possible via des déclencheurs ou autre chose?
sql-server
Philipp M
la source
la source
Réponses:
Il n'y a pas de prise en charge déclarative intégrée pour les colonnes non modifiables (sauf pour des cas prédéfinis spécifiques tels que
IDENTITY
)Cet élément Connect l'a demandé mais a été rejeté. Ajouter DRI pour appliquer des valeurs de colonne immuables
Un
UPDATE
déclencheur serait probablement le moyen le plus robuste d'y parvenir. Il pourrait vérifierIF UPDATE(CreatedByUser)
et déclencher une erreur et annuler la transaction s'il est vrai.la source
J'ai mis en œuvre l'
UPDATE TRIGGER
approche suggérée par la réponse de Martin Smith comme suit:(Remarque: la table a une colonne de clé primaire, appelée ID).
Je ne rejette la mise à jour que si la valeur de AssetTypeID change. Ainsi, la colonne pourrait être présente dans une mise à jour, et si la valeur ne changeait pas, elle passerait. (J'avais besoin de cette façon)
la source
AssetTypeID
est défini sur une valeur non nulle et que vous exécutezUPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_id
qu'il n'y aurait pas de restauration, carWHERE i.AssetTypeID <> d.AssetTypeID
dans le déclencheur serait évalué à faux, laissant cette colonne modifiable.Vous pouvez utiliser une vue avec une colonne dérivée. Essaye ça
la source
Pourquoi mettez-vous à jour la colonne createdby?
J'aurais deux colonnes, une [created_by] et une colonne [modified_by], où la première insertion insérerait toutes les colonnes respectives dans l'enregistrement, et toutes les mises à jour ultérieures mettraient simplement à jour la colonne [modified_by] (via un déclencheur dans l'application) couche, vous pouvez structurer votre mise à jour pour ne changer que le [modified_by], ainsi que vos colonnes respectives)
la source