Comment puis-je empêcher efficacement les mises à jour de toutes les colonnes sauf une dans un triggersur?

J'ai une table avec 250 colonnes, sur laquelle je dois écrire un triggersur qui empêchera les mises à jour de toutes les colonnes sauf une.

Il y a une colonne evt_updatable qui peut être mise à jour. La responsabilité de sortinggger est de triggersr une erreur lorsque l'user essaie de mettre à jour autre chose que cette colonne.

Quelles sont les différentes façons d'y parvenir? un moyen de détroit est de déclarer 500 variables qui stocke les valeurs insérées et supprimées. comme indiqué dans l'extrait de code ci-dessous.

SELECT @newColdata1 = i.col1 @oldColdata1 = d.col1 @newColdata2 = i.col2 @oldColdata2 = d.col1 ---------------------------- ------------------------------ -- same thing for remaining 250 rows FROM inserted i, deleted d WHERE i.evt_code = d.evt_code; 

En les comparant tous à des changements et en soulevant une erreur si quelque chose est changé. Y a-t-il une autre meilleure façon de le faire? comme il prend 500 différentes déclarations de variables et beaucoup plus de comparaisons. aidez-moi s'il vous plaît à cet égard

Simplement: Dans mon tableau, l'user devrait pouvoir changer une seule colonne s'il essaie de changer quoi que ce soit, le triggersur devrait triggersr une erreur.

C'est une bonne utilisation pour la fonction COLUMNS_UPDATED () disponible dans un sortinggger.

Si seulement la quasortingème colonne a été mise à jour, alors le model de bits qu'elle returnne sera quelque chose comme

 00001000 00000000 00000000 00000000 ... (binary) 

le premier octet a la valeur 8 et le rest est zéro, si une autre colonne est mise à jour, soit le premier octet ne sera pas égal à 8, soit l'un des autres ne sera pas égal à 0.

La fonction renvoie un varbinary, un bit pour chaque colonne. Pour 250 colonnes, il returnnera 32 octets de données (250/8), ce qui signifie que vous devrez tester chaque octet, c.-à-d.

 IF ( (SUBSTRING(COLUMNS_UPDATED(), 1,1) = 8) AND (SUBSTRING(COLUMNS_UPDATED(), 2,1) = 0) AND (SUBSTRING(COLUMNS_UPDATED(), 3,1) = 0) . . . AND (SUBSTRING(COLUMNS_UPDATED(),31,1) = 0) AND (SUBSTRING(COLUMNS_UPDATED(),32,1) = 0) ) 

Cela teste exactement qu'une colonne spécifique a été mise à jour. Si vous avez plusieurs colonnes qui pourraient être mises à jour, vous aurez besoin d'opérateurs au niveau du bit pour filterr le model binary.