Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [MySql] Un aiutino su semplice trigger

    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

  2. #2
    mmm se provo a mandare in esecuzione la versione senza commenti del trigger mi dà un errore che non capisco, questo è quello che dò in pasto al mio MySql

    codice:
    DELIMITER $$
    
    CREATE TRIGGER Avvisa_FeedBack_da_Venditore_Trg
        BEFORE INSERT ON feedbackVenditore
        FOR EACH ROW
    
        BEGIN
    
    	DECLARE mittente VARCHAR(20);
    	DECLARE destinatario VARCHAR(20);
    	DECLARE id_oggetto INTEGER;
    	DECLARE data_e_ora datetime;
    	DECLARE testo_messaggio TEXT;
    
    
    	SELECT Id_Acquirente
    	    INTO mittente
    	    FROM FeedbackVenditore
    	WHERE Id_Oggetto = NEW Id_Oggetto;
    
    
      SELECT Id_Venditore
    	    INTO destinatario
    	    FROM FeedbackVenditore
    	WHERE Id_Oggetto = NEW Id_Oggetto;
    
    
    	SELECT Id_Oggetto
    	    INTO id_oggetto
    	    FROM FeedbackVenditore
    	WHERE Id_Oggetto = NEW Id_Oggetto;
    
    
    	SET data_e_ora = CURRENTE_TIMESTAMP();
    
    
    
    	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');
    
    
    	INSERT INTO messaggio (Id_Messaggio, Mitt, Dest, Id_Oggetto, Data, Testo)
    	VALUES(NULL, mittente, destinatario, id_oggetto, data_e_ora, testo_messaggio);
    
    	END$$
    e mi dà il seguente errore:


    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
    for the right syntax to use near 'Id_Oggetto;


    SELECT Id_Venditore
    INTO destinatario
    FROM FeedbackVen' at line 17


    Oddio sono disperato...non capisco da cosa sia causato...please help me

  3. #3
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Mmm, prova a correggere dappertutto questo
    Id_Oggetto = NEW Id_Oggetto;

    con questo
    Id_Oggetto = NEW.Id_Oggetto;

  4. #4
    si alla fine ero riuscito a risolvere da me ed era quello.
    Grazie comunque
    Andrea

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.