Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    [MySQL] trigger, leggere dati da tabelle esterne

    mi serve un trigger che prima che venga inserita una riga nella tabella verifichi l'integrità dei dati da un'altra tabella esterna, ovvero, prendiamo per esempio le seguenti:

    codice:
    CREATE TABLE Officina (
    IDof                    INT(7)                 primary key,
    gestioneMotorini    ENUM('si','no')       not null,
    indirizzo               VARCHAR(30)
    );
    
    
    
    CREATE TABLE Veicolo (
    IDve          INT(5)                            primary key,
    tipo           ENUM('auto','motorino')      not null,
    officina      INT(7),
    FOREIGN KEY (officina)  REFERENCES Officina(IDof)
    );

    vorrei che prima di inserire/aggiornare una riga nella tabella Veicolo venisse verificato che l'officina che viene impostata non solo esista(foreignkey) ma che sia anche abilitata a gestire il veicolo in oggetto, ovvero se il veicolo è un motorino e l'officina che si inserisce non gestisce motorini l'inserimento/aggiornamento viene rifiutato

    ho quindi pensato a una cosa del genere :
    codice:
    DELIMITER //
    
    CREATE TRIGGER VerificaOfficinaBI
    BEFORE INSERT ON Veicolo
    FOR EACH ROW BEGIN
    
    DECLARE abilitazioneOf CHAR(2);
    
    SELECT gestioneMotorini FROM Officina WHERE IDof=NEW.officina;
    SET abilitazioneOf=gestioneMotorini;
    
    IF
    NEW.tipo='motorino' AND abilitazioneOf!='si' THEN
    SET NEW.tipo=null;
    END IF;
    
    END;
    //
    ma ottengo il seguente errore :
    codice:
    ERROR 1415 (0A000): Not allowed to return a result set from a trigger
    non sò come far "leggere" e poi "memorizzare" un valore da una tabella esterna in una variabile per effettuare un confronto, inoltre il parametro OLD non è valido nel comando INSERT, quindi vorrei sapere almeno se stò tentando qualcosa di impossibile...

    nel caso possa funzionare potreste gentilmente correggermi la sintassi di questo esempio così che possa costruirvi sopra il trigger funzionante al mio caso? stò leggendo da giorni la sintassi dei trigger e delle stored functions ma ormai il tempo stringe e da solo non ci riesco...
    è troppo impegnativo...

  2. #2
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    è impossibile da fare o è troppo difficile?
    è troppo impegnativo...

  3. #3
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    L'errore sta nella select, non puoi farla in quel modo!

    Credo tu debba fare:

    Codice PHP:
     SELECT gestioneMotorini into abilitazioneOf FROM Officina WHERE IDof=NEW.officina
    Fammi sapere.

    Ciao!

  4. #4
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    il trigger così corretto viene creato, il codice che ho inserito è il seguente:
    codice:
    DELIMITER //
    
    CREATE TRIGGER VerificaOfficinaBI
    BEFORE INSERT ON Veicolo
    FOR EACH ROW BEGIN
    
    DECLARE abilitazioneOf CHAR(2);
    
    SELECT gestioneMotorini INTO abilitazioneOf FROM Officina WHERE IDof=NEW.officina;
    
    SET abilitazioneOf=gestioneMotorini;
    
    IF
    NEW.tipo='motorino' AND abilitazioneOf!='si' THEN
    SET NEW.tipo=null;
    END IF;
    
    END;
    //


    però c'è un problema, ho inserito i seguenti campi nella tabella officina :

    codice:
    mysql> INSERT INTO Officina(IDof,gestioneMotorini,indirizzo)
    VALUES(1234567,'si','via della peppa 9');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> INSERT INTO Officina(IDof,gestioneMotorini,indirizzo)
    VALUES(2234567,'no','viale della nonna 12');
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select * from officina;
    +---------+------------------+----------------------+
    | IDof    | gestioneMotorini | indirizzo            |
    +---------+------------------+----------------------+
    | 1234567 | si               | via della peppa 9    |
    | 2234567 | no               | viale della nonna 12 |
    +---------+------------------+----------------------+

    e ho preparato i seguenti da mettere nella tabella veicolo di cui la prima riga deve essere accettata e la seconda rifiutata :
    codice:
    INSERT INTO veicolo(IDve,tipo,officina) VALUES(12345,'motorino','1234567');   OK
    
    INSERT INTO veicolo(IDve,tipo,officina) VALUES(22345,'motorino','2234567');   Rj

    ma con entrambe mi dà il seguente errore :
    codice:
    ERROR 1054 (42S22): Unknown column 'gestioneMotorini' in 'field list'

    da cosa dipende?
    è troppo impegnativo...

  5. #5
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Dal fatto che l'istruzione SET abilitazioneOf=gestioneMotorini; devi toglierla

  6. #6
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    vero, ora funziona tutto!!

    se volessi prendere dati da altre tabelle esterne per fare confronti mi basterebbe dichiarare una variabile per ognuno e fare una "SELECT attributo INTO variabile" giusto?
    è troppo impegnativo...

  7. #7
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Originariamente inviato da TeraBIT
    se volessi prendere dati da altre tabelle esterne per fare confronti mi basterebbe dichiarare una variabile per ognuno e fare una "SELECT attributo INTO variabile" giusto?
    yeah, that's right

    Se ti serve prendere più attributi dalla stessa tabella è sufficiente che fai:

    SELECT attributo1, attributo2 INTO variabile1, variabile2

    Ciao!

  8. #8
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    mi hai appena salvato la vita, grazie mille e a buon rendere!
    è troppo impegnativo...

  9. #9
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    select into con join

    ma la regola dell'ordine è valida anche se il numero di attributi è maggiore delle variabili?

    ho bisgono di sommare i valori di una colonna che ottengo attraverso una join e memorizzare solo quell'attributo in una variabile :
    codice:
    SELECT sum(Prezzo),Optional,Nolo INTO SpeseOptional
    FROM Optional JOIN Dotazione
    ON Optional.NomeID=Dotazione.Optional
    WHERE Nolo=NEW.CodNolo;
    se impostata così funziona lo stesso?

    SELECT attributo1, attributo2, attributo3 INTO variabile1 FROM ecc
    è troppo impegnativo...

  10. #10
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    altro problema nei trigger, nei BEFORE INSERT posso controllare valori preesistenti facendo riferimenti alla NEW.AttributoPrimaryKey che non può essere mai omesso, ma nelle UPDATE il riferimento alla riga viene fatto nella clausola WHERE, come faccio a risolvere questo dilemma?
    è troppo impegnativo...

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.