Newsgroup: it.comp.software.database
Titolo: RICHIESTA CHIARIMENTI SULL'UTILIZZO DEI TRIGGER IN SQL SERVER 7.0

salve
Vorrei un chiarimento sull'utilizzo dei trigger in sql server 7.0
Da quanto ho capito leggendo i libri, i trigger permetterebbero di
realizzare l'integritŕ referenziale tra due tabelle del database. Ad esempio
permettono di eseguire una cancellazione a cascata quando si esegue
un'eliminazione dalla prima tabella.
Ho fatto una prova tra due tabelle relazionate e quindi ho definito il
trigger sulla tabella primaria in modo che quando viene cancellato un record
da questa automaticamente vengano cancellati tutti record della tabella
secondaria. Tale trigger dovrebbe quindi permettere di evitare l'errore che
si genera quando ci sono record correlati.
Ebbene sembrerebbe che il trigger viene eseguito soltanto dopo che č stata
eseguita l'eliminazione dalla tabella primaria e conseguentemente l'errore
dovuto all'esistenza di record correlati non si riesce ad evitare.
Questo mi fa pensare che quanto letto sui libri e' valido soltanto se non ci
sono relazioni tra le diverse tabelle, cioe' se non ci sono altri vincoli.
Giusto ho sbagliato? Qualcuno puo' darmi altri chiarimenti?
Saluti
Paolo

 un'eliminazione dalla prima tabella.
Solo nell'assenza di constraint sulla tabella, nel caso di esistenza di
constraint (del tipo FOREIGN KEY), il blocco agisce prima.
Il Trigger ti serve per fare aggiornamenti di tipo diverso, per esempio
se hai una tabella "Fatture" ed una "Righe Fattura", un Trigger sulla
"Righe Fattura" potrebbe tenerti il totale sulla "Fattura" aggiornato
ad ogni inserimento/modifica.
Davide

Quello che dici è esatto. In effetti i trigger intervengono solo dopo che l'
"evento" UPDATE, INSERT, e DELETE
che li attiva si è verificato. Questo significa che se provi a eliminare un
record a cui punta un vincolo di
foreign key, il trigger non viene nemmeno attivato, dato che il vincolo
referenziale di foreign key blocca
l'operazione di delete con un errore.
L'unica soluzione per il tuo caso, volendo usare i trigger, sarebbe
eliminare il vincolo di foreigni key, con tutte
le possibili conseguenze nefaste per l'integrità referenziale dei dati.
Un'alternativa più sensata sarebbe quella di non eliminare i record
direttamente dalla tabella che ti interessa
con una semplice DELETE, ma scrivere una stored procedure a cui passi come
parametro la chiave del record
da eliminare ed effettua tutte le operazioni di cancellazione nell'ordine
corretto rispetto ai vincoli di foreign
key. Ovviamento questo è un po' più complicato!
P.S. sei sicuro che fare cancellazioni in cascata in genere sia una buona
idea? Se i progettisiti di Oracle e SQL
server non hanno implementato questa funzione non credi che avranno avuto
una buona ragione per non farlo?

 wrote in message
91q8hc$50jn7$3...@ID-18487.news.dfncis.de...



In SQL Server l'integrità referenziale può essere implementata in 2 modi:
1) usando DRI (declarative referential integrity) cioè coi costraint foreign
key ecc..
    in questo caso l'uso dei trigger non potrà MAI soddisfare le tue
esigenze in quanto in SQL Server
    i trigger vengono eseguiti sempre e solo dopo che si è verificato
l'evento (e a questo punto le regole di
    integrità hanno già fatto scaturire l'errore)
2) usando appunto i trigger, questo significa che sei tu a doverti
implementare tutti i trigger (di inserimento,             cancellazione e
aggiornamento) necessari per mantenere la consistenza dei tuoi dati. In
parole povere le
    relazioni le costruisci attraverso i trigger. In questo secondo caso ha
senso la generazione di trigger per la
    cancellazione in cascata.
Nel tuo caso ti consiglio lo sviluppo di stored procedure per l'eliminzione
dei dati dalle tabelle "dettaglio"
da eseguire prima della cancellazione del record "master" oppure : passa a
SQL Server 2000 il quale implementa
la DELETE CASCADE.

 ha scritto nel messaggio
news:91qh2e$v47$1...@lacerta.tiscalinet.it...

Sono spiacente di contraddirti ma Oracle almeno dalla versone 8 e ora anche
SQL Server 2000 implementano
la clausola DELETE CASCADE, comunque sono d'accordo sul fatto che l'uso di
tale pratica sia da limitare il
più possibile.