Precedente :: Successivo |
Autore |
Messaggio |
abaddon Utente adulto


Registrato: 05/04/04 16:32 Messaggi: 2033
|
Inviato: Mar Dic 26, 2006 10:30 pm Oggetto: Problema con query in PostgreSQL query |
|
|
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 |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mar Dic 26, 2006 10:34 pm Oggetto: |
|
|
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.  _________________ 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 |
|
 |
abaddon Utente adulto


Registrato: 05/04/04 16:32 Messaggi: 2033
|
Inviato: Mar Dic 26, 2006 10:48 pm Oggetto: |
|
|
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.  |
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 |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mar Dic 26, 2006 11:00 pm Oggetto: |
|
|
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 |
|
 |
abaddon Utente adulto


Registrato: 05/04/04 16:32 Messaggi: 2033
|
Inviato: Mar Dic 26, 2006 11:58 pm Oggetto: |
|
|
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 |
|
 |
Estevan Utente adolescente


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


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mer Dic 27, 2006 9:40 am Oggetto: |
|
|
Estevan ha scritto: | Posta il codice del trigger.... |
Guarda qualche post più sopra...  _________________ 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 |
|
 |
Estevan Utente adolescente


Registrato: 28/12/03 21:12 Messaggi: 310 Residenza: Sant'imbù Al d'emagna
|
Inviato: Mer Dic 27, 2006 10:39 am Oggetto: |
|
|
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 |
|
 |
|