[Basi di dati] Creazione TRIGGER
Ciao, avrei bisogno di aiuto per la creazione di un trigger. Praticamente devo fare in modo che un campo (tipo) di un utente che ha più di 10 iscrizioni confermate ad un evento venga modificato.
Le iscrizioni confermate sono date dal campo Stato di questa tabella:
ISCRIZIONE(Id, Data, UtenteS, UtenteP, Ruolo, Stato, IdEvento, Squadra)
(Per l'UtenteS della tabella, che poi riferisce il relativo utente nella tabella Utente)
1° passo dovrei contarle per ogni utente. Se sono più di 10
2° passo aggiorno la tabella Utente e cambio il campo Tipo.
Problema: mica posso fare un trigger che conta continuamente le iscrizioni!
L'unica cosa che mi viene in mente è questa: inserisco un campo aggiuntivo nella tabella Utente dove memorizzo il numero di iscrizioni confermate che l'utente ha, chiamiamolo ad esempio IscrizioniConfermate.
Quindi con un trigger che reagisce ad ogni conferma d'iscrizione aumento il contatore IscrizioniConfermate, e con un altro trigger che reagisce alla conferma di un'iscrizione farei il cambio di tipologia
Problema1: non so come tradurre in codice tutto questo.
Problema2: è possibile farlo senza aggiungere un attributo aggiuntivo?
Birra pagata per chiunque mi aiuti
Le iscrizioni confermate sono date dal campo Stato di questa tabella:
ISCRIZIONE(Id, Data, UtenteS, UtenteP, Ruolo, Stato, IdEvento, Squadra)
(Per l'UtenteS della tabella, che poi riferisce il relativo utente nella tabella Utente)
1° passo dovrei contarle per ogni utente. Se sono più di 10
2° passo aggiorno la tabella Utente e cambio il campo Tipo.
Problema: mica posso fare un trigger che conta continuamente le iscrizioni!
L'unica cosa che mi viene in mente è questa: inserisco un campo aggiuntivo nella tabella Utente dove memorizzo il numero di iscrizioni confermate che l'utente ha, chiamiamolo ad esempio IscrizioniConfermate.
Quindi con un trigger che reagisce ad ogni conferma d'iscrizione aumento il contatore IscrizioniConfermate, e con un altro trigger che reagisce alla conferma di un'iscrizione farei il cambio di tipologia
Problema1: non so come tradurre in codice tutto questo.
Problema2: è possibile farlo senza aggiungere un attributo aggiuntivo?
Birra pagata per chiunque mi aiuti

Risposte
Sinceramente non credo che contare le iscrizioni sia così problematico, soprattutto se hai definito un indice o qualcosa come una foreign key sull'utente nell'iscrizione. E non sarebbe comunque poi così tanto continuamente.
Sull'utente nell'iscrizione c'è la foreign key ovviamente.
Quindi potrei fare un trigger sulla tabella iscrizione che per ogni UPDATE dello stato di un'iscrizione mi fa il conteggio di quante sono quelle confermate per quell'utente, e poi se il dato è superiore a 10 mi fa un update sulla tabella utente?
Ma è possibile legare un trigger a una tabella che però fa operazioni anche su un'altra?
Quindi potrei fare un trigger sulla tabella iscrizione che per ogni UPDATE dello stato di un'iscrizione mi fa il conteggio di quante sono quelle confermate per quell'utente, e poi se il dato è superiore a 10 mi fa un update sulla tabella utente?
Ma è possibile legare un trigger a una tabella che però fa operazioni anche su un'altra?
Ok ho provato a fare una cosa del genere
CREATE TRIGGER PromozioneUP
AFTER UPDATE ON ISCRIZIONE
FOR EACH ROW
SELECT COUNT(*) AS ISCRIZIONI_CONFERMATE
FROM ISCRIZIONE
WHERE ISCRIZIONE.Stato='C'
BEGIN
WHEN ISCRIZIONI_CONFERMATE>10
UPDATE UTENTE
SET NEW.TIPO='P'
WHERE UTENTE.Username=NEW.USERNAME
END
Naturalmente mi dà errore di sintassi
CREATE TRIGGER PromozioneUP
AFTER UPDATE ON ISCRIZIONE
FOR EACH ROW
SELECT COUNT(*) AS ISCRIZIONI_CONFERMATE
FROM ISCRIZIONE
WHERE ISCRIZIONE.Stato='C'
BEGIN
WHEN ISCRIZIONI_CONFERMATE>10
UPDATE UTENTE
SET NEW.TIPO='P'
WHERE UTENTE.Username=NEW.USERNAME
END
Naturalmente mi dà errore di sintassi

Che errore ti viene restituito? Sinceramente uso raramente i trigger per cui non sono sicuro di quali siano i loro limiti. Credo dipenda anche dal particolare database che stai usando per fare le tue prove.
Ho risolto con 2 trigger e l'aggiunta di un attributo che tiene traccia del numero di iscrizioni confermate, altrimenti era un casino (almeno per me). Comunque il DB è MySQL.
Eccoli:
1° trigger
CREATE TRIGGER `Incremento_Iscrizioni`
AFTER UPDATE ON `ISCRIZIONE`
FOR EACH ROW
BEGIN
IF NEW.Stato <> OLD.Stato AND New.Stato='C' THEN
UPDATE UTENTE
SET Iscrizioni_Confermate=Iscrizioni_Confermate+1
WHERE UTENTE.Username=NEW.UtenteS;
END IF; END
CREATE TRIGGER `PromozioneUP`
BEFORE UPDATE ON `UTENTE`
FOR EACH ROW
BEGIN
IF NEW.Iscrizioni_Confermate>10 AND NEW.Tipo='S' THEN SET NEW.Tipo='P';
END IF; END
Grazie di tutto!
Eccoli:
1° trigger
CREATE TRIGGER `Incremento_Iscrizioni`
AFTER UPDATE ON `ISCRIZIONE`
FOR EACH ROW
BEGIN
IF NEW.Stato <> OLD.Stato AND New.Stato='C' THEN
UPDATE UTENTE
SET Iscrizioni_Confermate=Iscrizioni_Confermate+1
WHERE UTENTE.Username=NEW.UtenteS;
END IF; END
CREATE TRIGGER `PromozioneUP`
BEFORE UPDATE ON `UTENTE`
FOR EACH ROW
BEGIN
IF NEW.Iscrizioni_Confermate>10 AND NEW.Tipo='S' THEN SET NEW.Tipo='P';
END IF; END
Grazie di tutto!