Ciao,
stò concludendo un progetto per un esame universitario e devo cacciarci dentro qualche triggerino e qualche piccola stored procedure.
Questa mattina ho studiato da solol'argomento ed ho creato il mio primo trigger ma esattamente non ho capito come testarlo e non sò neanche se vada bene (se ci sono errori logici o sintattici) per cui vi chiedo un parere ed eventuali correzioni.
Il mio progetto tratta un sistema di aste online ispirato ad e-bay (ovviamente è un esempio giocattolo) e quì se volete potete vedere lo schema fisico del mio database anche se per questo trigger non credo serva in quanto entrano in gioco solo 2 tabelle: http://www.siatec.net/andrea/uni/db/fisico.jpg
PREMESSA: Come su e-bay, dopo che un utente ha acquistato un oggetto rilascia un feedback al venditore relativo all'oggetto comprato, poi quando il venditore riceve il feedback ne rilascia a sua volta uno all'acquirente. Per questo motivo le tabelle dei feedback mettono in relazione un utente con un altro utente e con una determinata inserzione.
Stessa cosa vale per i messaggi che, come su e-bay, mettono in relazione un utente con un altro utente ed una determinata inserzione (perchè un messaggio è relativo ad una certa inserzione).
Queste sono le strutture delle due tabelle che entrano in gioco nel mio trigger:
codice:
TABELLA FEEDBAKVENDITORE:
mysql> describe feedbackvenditore\g
+---------------+--------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------------------------------+------+-----+---------+-------+
| Id_Oggetto | int(11) | NO | PRI | NULL | |
| Id_Venditore | varchar(20) | NO | | NULL | |
| Id_Acquirente | varchar(20) | NO | | NULL | |
| Feedback | enum('Positivo','Neutro','Negativo') | NO | | NULL | |
| Commento | varchar(255) | YES | | NULL | |
+---------------+--------------------------------------+------+-----+---------+-------+
TABELLA MESSAGGIO:
mysql> describe messaggio\g
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| Id_Messaggio | int(11) | NO | PRI | NULL | auto_increment |
| Mitt | varchar(20) | NO | | NULL | |
| Dest | varchar(20) | NO | MUL | NULL | |
| Id_Oggetto | int(11) | NO | | NULL | |
| Data | datetime | NO | | NULL | |
| Testo | text | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
Detto questo io voglio realizzare un trigger sulla tabella FEEDBACKVENDITORE che si comporti così:
Quando viene inserito un recordo nella tabella FEEDBACKVENDITORE (quindi logicamente quando un venditore riceve un feedback da un acquirente relativo ad una certa inserzione) viene mandato un messaggio al venditore che gli dice che l'utente in questione gli ha rilasciato un feedback per quel prodoto e che è pregato di rilasciare a sua volta il feedback a quell'utente
Per fare questa cosa quando viene inserito un record nella tabella FEEDBACKVENDITORE il trigger deve inserire un record nella tabella MESSAGGIO così fatto:
Il campo Mitt di MESSAGGIO deve contenere il valore del campo Id_Acquirente del nuovo record inserito nella tabella FEEDBACKVENDITORE
Il campo Dest di MESSAGGIO deve contenere il valore del campo Id_Venditore del nuovo record inserito nella tabella FEEDBACKVENDITORE
Il campo Id_Oggetto di MESSAGGIO deve contenere il campo Id_Oggetto del nuovo record inserito nella tabella FEEDBACKVENDITORE
Il campo Data di MESSAGGIO deve contenere data ed ora attuali
Il campo Testo di MESSAGGIO deve contenere il testo di avviso dell'avvenuta ricezione di un feedback
ed il campo IdMessaggio di MESSAGGIO deve essere NULL perchè tanto è la chiave della tabella ed è auto increment quindi ci pensa il dbms a metterciil valore giusto.
Questo è il trigger che ho creato io, dite che va bene? ci sono errori sintattici? Come devo darlo in pasto al mio DB per farlo funzionare? Altra cosa...è molto commentato ma non sò come si mettano i commenti ai trigger per MySql....
codice:
/*Crea un trigger che inserisce un record nella cartella MESSAGGIO quando un venditore lascia un feedback ad un acquirente */
DELIMITER $$ // Nuovo deliminatore
CREATE TRIGGER Avvisa_FeedBack_da_Venditore_Trg
BEFORE INSERT ON feedbackVenditore // L'evento che fà partire il trigger è un inserimento nella tabella feedbackVenditore
FOR EACH ROW // e deve essere eseguito una volta sola per ogni riga
BEGIN // Inizia il codice da eseguire del trigger
DECLARE mittente VARCHAR(20); // Dichiara la variabile mittente per contenere una stringa di al più 20 caratteri
DECLARE destinatario VARCHAR(20); // Dichiara la variabile destinatario per contnere una stringa di 20 caratteri
DECLARE id_oggetto INTEGER; // Dichiara la variabile id_oggetto di tipo integer
DECLARE data_e_ora datetime; // Dichiara la variabile data e ora che conterrà la data e l'ora
DECLARE testo_messaggio TEXT; // Dichiara la variabile testo per contenere il testo del messaggio di tipo text
/** Ora metto dentro la variabile mittente il valore del campo Id_Venditore del nuovo record inserito nella tabella
FEEDBACKVENDITORE */
SELECT Id_Acquirente // Seleziona il campo Id_Acquirente
INTO mittente // Copiane il contenuto dentro la variabile mittente
FROM FeedbackVenditore // il campo Id_Acquirente selezionato si riferisce alla tabella FeedbackVenditore
WHERE Id_Oggetto = NEW Id_Oggetto; // dove ci si riferisce al nuovo record inserito nella tabella FeedbackVenditore
/** Ora metto dentro la variabile destinatario il valore del campo Id_Acquirente del nuovo record inserito nella
tabella FEEDBACKVENDITORE */
SELECT Id_Venditore // Seleziona il campo Id_Venditore
INTO destinatario // Copiane il contenuto dentro la variabile destinatario
FROM FeedbackVenditore // il campo Id_Venditore selezionato si riferisce alla tabella FeedbackVenditore
WHERE Id_Oggetto = NEW Id_Oggetto; // dove ci si riferisce al nuovo record inserito nella tabella FeedbackVenditore
/** Ora metto dentro la variabile id_oggetto il valore del campo Id_Oggetto del nuovo record inserito nella tabella
FEEDBACKVENDITORE */
SELECT Id_Oggetto // Seleziona il campo Id_Oggetto
INTO id_oggetto // Copiane il contenuto dentro la variabile id_oggetto
FROM FeedbackVenditore // il campo Id_oggetto selezionato si riferisce alla tabella FeedbackVenditore
WHERE Id_Oggetto = NEW Id_Oggetto; // dove ci si riferisce al nuovo record inserito nella tabella FeedbackVenditore
/** Ora metto dentro la variabile data_e_ora la data e l'ora corrente */
SET data_e_ora = CURRENTE_TIMESTAMP(); // Metto dentro la variabile la data ed il tempo
/** Ora metto dentro la variabile testo_messaggio il testo del messaggio da inviare all'utente venditore che ha
appena ricevuto un feedback da un acquirente relativo ad un determinato oggetto*/
SET testo_messaggio = CONCAT('Un acquirente avente username: ', Id_Acquirente, ' ti ha lasciato un feedback relativo alla vendita di un oggetto avente id: ', id_oggetto, 'Sei pregato di rilasciare a tua volta il feedback a questo acquirente');
/** Ora devo inserire nella tabella MESSAGGIO il record che rappresenta il messaggio che deve essere ricevuto dal
venditore che ha appena ricevuto un feedback nella tabella FEEDBACKVENDITORE */
INSERT INTO messaggio (Id_Messaggio, Mitt, Dest, Id_Oggetto, Data, Testo)
VALUES(NULL, mittente, destinatario, id_oggetto, data_e_ora, testo_messaggio);
END$$ // Fine codice del trigger
Vi prego di darmi una mano perchè tra pochi giorni devo consegnare sto progetto e non sò prorpio dove sbattere la testa su questo argomento....
Grazie
Andrea