Torna in homepage www.vincenzomanzoni.com
Homepage personale e blog di Vincenzo Manzoni
 
 FAQFAQ   CercaCerca   Cerca con GoogleCerca con Google   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati   Feed AtomFeed
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

Problema con query in PostgreSQL query

 
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> L'angolo di Leonardo Da Vincienzomanzoni.com
Precedente :: Successivo  
Autore Messaggio
abaddon
Utente adulto
Utente adulto


Registrato: 05/04/04 16:32
Messaggi: 2033

MessaggioInviato: Mar Dic 26, 2006 10:30 pm    Oggetto: Problema con query in PostgreSQL query Rispondi citando

ho un problemino con una query di postgresql, sto cercando di spostare molti controlli che faccio a lv software a lv database per migliorare la sicurezza ma ho incontrato alcuni problemini...

ho una tabella chiamata bolla con svariati campi tra cui uno chiamato stato che puo' assumere il valore "da inviare"

io voglio che eseguendo questa query:
DELETE FROM bolla WHERE numero=1 AND anno=2006

mi dia errore o faccia un rollback se il campo stato si quel record ha valore "da inviare" mentre committi se ha stato diverso.

so che mi basterebbe aggiungere un altra condizione AND stato!="da inviare" alla query ma così facendo è il programma che mi fa il controllo e non il database.

ho provato a guardare i trigger e ho ottenuto per metà il mio scopo usando questo triggerino qua:

Codice:
CREATE OR REPLACE FUNCTION bolla_delete()
  RETURNS "trigger" AS
$BODY$
begin

   if (OLD.stato!='da inviare')
   then
      ROLLBACK;      
   end if;
   return OLD;
end;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;


Codice:

CREATE TRIGGER trigger_bolla_delete
  AFTER DELETE
  ON bolla
  FOR EACH ROW
  EXECUTE PROCEDURE bolla_delete();



lui funziona... però male.. nel senso che se lo stato ha valore "da inviare" mi entra nell'if e il comando rollback non va bene messo così e si incavola il dbms bloccandomi il delete... se riuscivo a trovare una soluzione che funzioni senza darmi errore di sintassi sarei più contento... ^^''
Top
Profilo Invia messaggio privato HomePage
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Mar Dic 26, 2006 10:34 pm    Oggetto: Rispondi citando

A me non pare male mettere stato != 'da inviare'... Perché dici che il controllo passa al programma?

Un consiglio di altra natura: non eliminare mai una riga da un database, ma usa un flag di cancellazione logica.

La memoria storica è importante. Smile
_________________
Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla
Top
Profilo Invia messaggio privato HomePage
abaddon
Utente adulto
Utente adulto


Registrato: 05/04/04 16:32
Messaggi: 2033

MessaggioInviato: Mar Dic 26, 2006 10:48 pm    Oggetto: Rispondi citando

vinz ha scritto:
A me non pare male mettere stato != 'da inviare'... Perché dici che il controllo passa al programma?

Un consiglio di altra natura: non eliminare mai una riga da un database, ma usa un flag di cancellazione logica.

La memoria storica è importante. Smile



proprio per questo mi serve che sia il db a gestire i delete, per evitare che gente mettendo le mani dentro il db mi vada a creare problemi, le bolle con quello stato sono state appena create e sono ancora slegate dal resto dei dati. se per sbaglio magari durante manutenzione scappa un delete il dbms mi impedirebbe qualsiasi operazione.

Vai a sapere chi prende in mano sta roba fra qualche tempo... più paletti metto più son contento...
Top
Profilo Invia messaggio privato HomePage
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Mar Dic 26, 2006 11:00 pm    Oggetto: Rispondi citando

Non puoi fare il trigger attivo BEFORE DELETE? Se il campo vale "da inviare", fai rollback.
_________________
Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla
Top
Profilo Invia messaggio privato HomePage
abaddon
Utente adulto
Utente adulto


Registrato: 05/04/04 16:32
Messaggi: 2033

MessaggioInviato: Mar Dic 26, 2006 11:58 pm    Oggetto: Rispondi citando

vinz ha scritto:
Non puoi fare il trigger attivo BEFORE DELETE? Se il campo vale "da inviare", fai rollback.


da questo errore, avevo già provato


Citazione:
ERROR: SPI_execute_plan failed executing query "ROLLBACK": SPI_ERROR_TRANSACTION
CONTEXT: PL/pgSQL function "bolla_delete" line 5 at SQL statement
Top
Profilo Invia messaggio privato HomePage
Estevan
Utente adolescente
Utente adolescente


Registrato: 28/12/03 21:12
Messaggi: 310
Residenza: Sant'imbù Al d'emagna

MessaggioInviato: Mer Dic 27, 2006 9:40 am    Oggetto: Rispondi citando

Posta il codice del trigger....
_________________
http://email2image.altervista.org
Protect your mail against spam!!
Top
Profilo Invia messaggio privato
vinz
Amministratore
Amministratore


Registrato: 12/12/03 12:56
Messaggi: 6648
Residenza: San Pellegrino Terme (Bergamo)

MessaggioInviato: Mer Dic 27, 2006 9:40 am    Oggetto: Rispondi citando

Estevan ha scritto:
Posta il codice del trigger....

Guarda qualche post più sopra... Smile
_________________
Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla
Top
Profilo Invia messaggio privato HomePage
Estevan
Utente adolescente
Utente adolescente


Registrato: 28/12/03 21:12
Messaggi: 310
Residenza: Sant'imbù Al d'emagna

MessaggioInviato: Mer Dic 27, 2006 10:39 am    Oggetto: Rispondi citando

Embarassed

Non va il roolbackj perchè non hai mai fatto una start transaction, prova con raise exception!

eccoti un pezzo di un mio trigger....

Codice:

....
IF (num>0) THEN
RAISE EXCEPTION 'Tariffa già presente per questo prefisso';
RETURN NULL;
END IF;
......
   
END;
.....


RAISE ti blocca la continuazione del trigger e quindi dell'evento associato nel tuo caso la delete

prova e fammi sapere ciao cive
_________________
http://email2image.altervista.org
Protect your mail against spam!!
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> L'angolo di Leonardo Da Vincienzomanzoni.com Tutti i fusi orari sono GMT 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi


Powered by phpBB © 2001, 2005 phpBB Group
phpbb.it