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

    [MySQL] Problema chiamata stored procedure da trigger

    Buongiorno a tutti.
    Mi sono appena iscritto perchè ho un problema da risolvere.
    Sto lavorando con un database in cui ho 2 tabelle:
    "user_" e "userdetails" di seguito descritte

    -user_
    codice:
    +-----------------------+---------------+------+-----+---------+-------+
    | Field                 | Type          | Null | Key | Default | Extra |
    +-----------------------+---------------+------+-----+---------+-------+
    | userId                | bigint(20)    | NO   | PRI | NULL    |       |
    | createDate            | datetime      | YES  |     | NULL    |       |
    | password_             | varchar(75)   | YES  |     | NULL    |       |
    | emailAddress          | varchar(75)   | YES  | MUL | NULL    |       |
    | firstName             | varchar(75)   | YES  |     | NULL    |       |
    | lastName              | varchar(75)   | YES  |     | NULL    |       |
    | active_               | tinyint(4)    | YES  |     | NULL    |       |
    +-----------------------+---------------+------+-----+---------+-------+
    -userdetails
    codice:
    +----------+------------+------+-----+---------+-------+
    | Field    | Type       | Null | Key | Default | Extra |
    +----------+------------+------+-----+---------+-------+
    | userId   | bigint(20) | NO   | PRI | NULL    |       |
    | lat      | double     | NO   |     | NULL    |       |
    | lon      | double     | NO   |     | NULL    |       |
    | visibile | tinyint(1) | NO   |     | NULL    |       |
    +----------+------------+------+-----+---------+-------+
    Vorrei fare in modo che, all'aggiunta di un nuovo utente nella tabella user_ sia automaticamente aggiunta una nuova riga nella tabella userdetails che abbia lo stesso userId del nuovo utente.
    Per far ciò avevo realizzato un trigger che al suo interno richiama una stored procedure. Ecco il codice:

    codice:
    delimiter //
    create procedure getlastpk(OUT id BIGINT)
    begin
    	declare lastpk bigint;
    	declare cercapk cursor for 
    		select userId from user_ where createDate=(select max(createDate) from user_);
    	open cercapk;
    	fetch cercapk into lastpk;
    	close cercapk;
    	set id=lastpk;
    end;
    //
    delimiter ;
    
    delimiter //
    create trigger tr_dettagli_user
    	AFTER INSERT
    	ON user_
    	FOR EACH ROW
    	call getlastpk(@pk);
    	INSERT INTO userdetails VALUES((select @pk),0.0,0.0,false,false);
    //
    delimiter ;
    Il codice non genera errori, ma all'aggiunta di un nuovo utente nella tabella user_ nessuna riga viene generata in userdetails.

    Dove ho sbagliato? Come potrei fare?
    Grazie per le eventuali risposte.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Non l'ho testata ma dovrebbe andare.

    codice:
    delimiter //
    create trigger tr_dettagli_user
    	AFTER INSERT
    	ON user_
    	FOR EACH ROW
    	INSERT INTO userdetails set userid = new.userid
    //
    delimiter ;

  3. #3
    Prima di tutto grazie della risposta.
    Ho provato il tuo codice ma non va, mi da il seguente errore:
    ERROR 1364 (HY000): Field 'lat' doesn't have a default value

    Comunque per la cronaca, dopo aver bestemmiato in aramaico sono riuscito a risolvere semplicemente mettendo il blocco di codice Sql del trigger tra BEGIN ed END.
    Quindi da così:
    codice:
    delimiter //
    create trigger tr_dettagli_user
    	AFTER INSERT
    	ON user_
    	FOR EACH ROW
    	call getlastpk(@pk);
    	INSERT INTO userdetails VALUES((select(@pk)),0.0,0.0,false,false);
    //
    delimiter ;
    a così
    codice:
    delimiter //
    create trigger tr_dettagli_user
    	AFTER INSERT
    	ON user_
    	FOR EACH ROW
    	BEGIN
    		call getlastpk(@pk);
    		INSERT INTO userdetails VALUES((select(@pk)),0.0,0.0,false,false);
    	END
    //
    delimiter ;
    evidentemente quando veniva richiamato il trigger, veniva effettuata solo la prima operazione (call getlastpk(@pk)) omettendo la seconda, cioè l'insert.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Intendevo di rimuovere tutto il tuo codice e di usare solo quello che ti ho postato, senza la procedure.

  5. #5
    è quello che ho fatto, ma forse ho risposto in maniera ambigua.
    L'errore che ho citato non me lo da quando definisco il trigger, ma quando vado a fare la insert nella tabella user_
    Il problema è che
    INSERT INTO userdetails set userid = new.userid;
    non specifica il valore che avranno lat, lon e visibile.
    Quindi l'ho modificata così
    codice:
    delimiter //
    create trigger tr_dettagli_user
    	AFTER INSERT
    	ON user_
    	FOR EACH ROW
    	INSERT INTO userdetails set userid = new.userid, lat=0.0, lon=0.0, visibile=false;
    //
    delimiter ;
    ed effettivamente questa soluzione funziona ed è molto meglio della mia, mi risparmia di usare la procedure.
    Ti ringrazio dell'aiuto.

    Tiziano.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.