Provo a spiegarmi meglio.
L'applicazione che gestisce i dati è scritta da un altro, l'intento è quello di non mettere le mani in quel codice.
La tabella in questione ha la bellezza di 90 campi(non è un mio progetto e non val la pena discutere le scelte altrui).
In questa tabella esistono un certo numero di elementi (righe) i cui valori possono essere modificati a piacere dall'utente.
I dati di un'altra serie invece non debbono poter essere modificati, o meglio non tutte le colonne debbono poter essere modificate; Per esempio le note o il flag per renderli visibili debbono poter essere modificati, mentre invece i dati che attengono ad altre informazioni debbono mantenersi invariati.
A questo punto il trigger verifica che:
1) il record modificato appartenga al gruppo di quelli da non toccare
2) se ne fa parte controlla che la colonna modificata sia tra quelle modificabili (se i dati in deleted sono differenti da quelli in inserted)
3) DOVREBBE controllare se sono stati modificati i dati delle altre colonne (quelle intoccabili)
Se si sono variati solo i dati modificabili non accade nulla, se viceversa le modifiche coinvolgono anche (o esclusivamente) le altre colonne si annulla la modifica.
Ora la verifica al punto due la si fa senza problemi perché le colonne modificabili sono poche e me la cavo con qualche "OR" nella clausola "Where".
Di seguito un paio di esempi:
Questo per verificare la condizione in 1)
if (exists(select 1 from inserted where ALI_TABELLE='§-2#')) or (exists(select 1 from inserted where ALI_TABELLE='§-1#'))
Questo per la condizione in 2)
if exists(select i.ali_codice from inserted as i join deleted as d
on (d.ALI_CODICE=i.ALI_CODICE)
where (d.ALI_NOTE<> i.ALI_NOTE)or (d.ALI_NOTE1<>i.ALI_NOTE1)or(d.FL_ATTIVO<>i.FL_ATTIVO)
or(d.ALI_RICETTA<>i.ALI_RICETTA)or(d.ALI_PICCOLA<>i.ALI_PICCOLA)or(d.ALI_GRANDE<>i.ALI_GRANDE)
or(d.ALI_MEDIA<>i.ALI_MEDIA))
Ma per la verifica 3) son dolori, impostare una novantina di "OR" mi pare di difficile implementazione e così pure scrivere per novanta e passa volte lo stesso codice dove cambio solo il nome del campo da mettere in comparazione.
L'applicazione che agisce su questi dati esegue un update dando un comando su tutti i campi per cui la funzione UPDATE nel trigger mi dà TRUE per tutte le colonne.
Diciamo che per il momento mi debbo rassegnare perché nemmeno nei testi sacri ho trovato traccia di una soluzione perseguibile.
Ho provato a creare una tabella che contiene i nomi di tutte le colonne della tabella inserted per scandirla con un cursore, ma quando ho il nome del campo in una variabile non lo posso usare per comporre il comando di verifica (non si accettano variabili per definire il nome della colonna da interrogare), né posso utilizzare la chiamata ad un EXEC dandogli in pasto la stringa di comando composta con le variabili, perché le tabelle da verificare sono le due pseudotabelle Inserted e Deleted che hanno visibilità limitata all'ambito del trigger e non riesco a passarle come parametri.
Insomma per ora rimango a sguazzare nella palta e mi debbo accontentare di un mezzo risultato.
Grazie per l'attenzione e... occhio all'armonia domestica veh!
Beppe