Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21

    Stored procedure cancella tutto!

    codice:
    DROP PROCEDURE IF EXISTS Changerole; delimiter $ CREATE PROCEDURE Changerole (OldRole CHAR(8), Newrole CHAR(8), IdUser INT) BEGIN IF (OldRole="admin" AND NewRole="mod") THEN DELETE FROM administrators WHERE iduser=IdUser; INSERT INTO moderators (iduser) VALUES (IdUser); END IF; IF (OldRole="admin" AND NewRole="user") THEN DELETE FROM administrators WHERE iduser=IdUser; INSERT INTO normalusers (iduser) VALUES (IdUser); END IF; IF (OldRole="mod" AND NewRole="admin") THEN DELETE FROM moderators WHERE iduser=IdUser; INSERT INTO administrators (iduser) VALUES (IdUser); END IF; IF (OldRole="mod" AND NewRole="user") THEN DELETE FROM moderators WHERE iduser=IdUser; INSERT INTO normalusers (iduser) VALUES (IdUser); END IF; IF (OldRole="user" AND NewRole="admin") THEN DELETE FROM normalusers WHERE iduser=IdUser; INSERT INTO administrators (iduser) VALUES (IdUser); END IF; IF (OldRole="user" AND NewRole="mod") THEN DELETE FROM normalusers WHERE iduser=IdUser; INSERT INTO moderators (iduser) VALUES (IdUser); END IF; END; $ delimiter ;
    Praticamente questa procedura mi cancella da una certa tabella e mette la stessa riga in un altra. Il problema è che l'insert funziona correttamente, ma quando fa il delete cancella tutta la tabella invece che solo quella riga. Perché?

  2. #2
    Ciao,

    codice:
    THEN DELETE FROM moderators WHERE iduser=IdUser;

    pessima idea quella di chiamare il parametro locale della procedura come il nome del campo!!!


    mysql non è case sensitive a priori ma dipende dal sistema operativo che c'è sotto...

    ...quindi molto probabilmente quando scrivi
    codice:
    THEN DELETE FROM moderators WHERE iduser=IdUser;
    in realtà stai scrivendo qualcosa del tipo
    codice:
    THEN DELETE FROM moderators WHERE 23=23;
    il che equivale a cancellare tutta la tabella perché la where è sempre verificata (23 è sempre uguale a 23)

    Fai così:, cambia nome al parametro idUser e chiamalo ad esempio p_IdUser
    codice:
    PROCEDURE Changerole (OldRole CHAR(8), Newrole CHAR(8), p_IdUser INT)
    poi sostituisci nelle delete di conseguenza:
    codice:
    THEN DELETE FROM moderators WHERE iduser=p_IdUser;
    vedi se va!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    È vero, ora va. Non mi ricordavo che non fosse case-sensitive. Grazie mille

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.