[Basi di dati] Creazione TRIGGER

Messaggioda EveyH » 23/09/2017, 23:21

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 :-D
EveyH
Junior Member
Junior Member
 
Messaggio: 123 di 313
Iscritto il: 18/01/2015, 15:18

Re: [Basi di dati] Creazione TRIGGER

Messaggioda apatriarca » 24/09/2017, 04:10

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4829 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Basi di dati] Creazione TRIGGER

Messaggioda EveyH » 24/09/2017, 11:40

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?
EveyH
Junior Member
Junior Member
 
Messaggio: 124 di 313
Iscritto il: 18/01/2015, 15:18

Re: [Basi di dati] Creazione TRIGGER

Messaggioda EveyH » 24/09/2017, 12:17

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 :(
EveyH
Junior Member
Junior Member
 
Messaggio: 125 di 313
Iscritto il: 18/01/2015, 15:18

Re: [Basi di dati] Creazione TRIGGER

Messaggioda apatriarca » 24/09/2017, 18:53

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4830 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Basi di dati] Creazione TRIGGER

Messaggioda EveyH » 24/09/2017, 20:24

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!
EveyH
Junior Member
Junior Member
 
Messaggio: 126 di 313
Iscritto il: 18/01/2015, 15:18


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite