Vai al contenuto


Foto

SQL (PostgreSQL)


Questa discussione e' stata archiviata Questo significa che non e' possibile rispondere
96 risposte a questa discussione

#81 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 15 maggio 2012 - 15:23

Oltre a felice sentiti utile :pff:

CREATE OR REPLACE FUNCTION dmc_on_after_delete_frame()

RETURNS trigger AS $retval$

BEGIN



   IF (SELECT COUNT(*) FROM "Frame") = 0 THEN

	  PERFORM reset_sequences();

   END IF;



   RETURN NEW;



END;

$retval$ LANGUAGE plpgsql;



Se la tabella "Frame" è vuota, resetto le sequences.
Mi dice che non è vuota.

:lnrg:


Come hai configurato il trigger sulla tabella?
Ho provato al volo con un


CREATE TRIGGER test_tbl_del AFTER DELETE ON test_tbl FOR EACH STATEMENT EXECUTE PROCEDURE after_del();


e così a me funziona.
In alternativa, che fa reset_sequences()? Una ALTER SEQUENCE x RESTART WITH o qualcos'altro?
In Soviet Italy, the evil army owns you!

#82 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 15 maggio 2012 - 19:36

Io l'ho fatto AFTER DELETE ... ON EACH ROW non STATEMENT.

Si, la reset fa esattamente quello anche se cerca tutte le sequence create da me e le resetta tutte.

Boh, se a te funziona deve essere qualche cazzata mia.... a trovarla, saranno circa 2000 righe di sql :pua:
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#83 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 15 maggio 2012 - 21:34

Io l'ho fatto AFTER DELETE ... ON EACH ROW non STATEMENT.

Si, la reset fa esattamente quello anche se cerca tutte le sequence create da me e le resetta tutte.

Boh, se a te funziona deve essere qualche cazzata mia.... a trovarla, saranno circa 2000 righe di sql :pua:


Se non è una cazzata infilata in quelle 2000 righe di sql può essere benissimo che per qualche motivo strano in reset_sequences() non si abbia visibilità del fatto che la tabella è vuota. Mi pare strano, se domani in ufficio la giornata è sonnacchiosa come oggi faccio una prova.
Secondo me comunque puoi usare tranquillamente un FOR EACH STATEMENT per un trigger del genere.
In Soviet Italy, the evil army owns you!

#84 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 16 maggio 2012 - 07:28

Se non è una cazzata infilata in quelle 2000 righe di sql può essere benissimo che per qualche motivo strano in reset_sequences() non si abbia visibilità del fatto che la tabella è vuota. Mi pare strano, se domani in ufficio la giornata è sonnacchiosa come oggi faccio una prova.
Secondo me comunque puoi usare tranquillamente un FOR EACH STATEMENT per un trigger del genere.


Ok, ho capito (ma anche no).

Siccome la reset_sequences() prima la chiamavo a mano, allora c'ho messo un controllo anche li sul count(*).

CREATE OR REPLACE FUNCTION reset_sequences()

RETURNS void AS $$

DECLARE

   name text;

BEGIN



   IF (SELECT COUNT(*) FROM "Frame") > 0 THEN

	  RAISE INFO 'Cannot reset as table Frame is not empty!';

	  RETURN;

   END IF;



   FOR name IN SELECT c.relname FROM pg_class c WHERE c.relkind = 'S'

   LOOP

	  EXECUTE 'ALTER SEQUENCE "' || name || '" RESTART';

   END LOOP;

  

END;

$$  LANGUAGE plpgsql;


Se tolgo il controllo (la prima IF) funziona.

Quello che non capisco è perché la IF della funzione chiamata dal trigger dia COUNT(*) = 0 e questa no.
Comunque grazie.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#85 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 16 maggio 2012 - 09:06

Quello che non capisco è perché la IF della funzione chiamata dal trigger dia COUNT(*) = 0 e questa no.
Comunque grazie.


Really strange, sotto la versione di Postgres che uso (9.1) il tutto funziona senza problemi.
Mistero della fede nei db relazionali :asd:
In Soviet Italy, the evil army owns you!

#86 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 16 maggio 2012 - 09:11

8.4 qui.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#87 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 16 maggio 2012 - 10:30

Altra cosa strana. Ho 2 tabelle, una dipendente dall'altra con, quindi, una foreign key.
Grammar è la boss e GrammarRule è la slave.

CREATE TABLE "Grammar"
(
"Id" serial NOT NULL,
"FrameId" integer NOT NULL,
"PhraseId" integer NOT NULL,
"Name" character(64) NOT NULL,
"StartSymbol" character(64) NOT NULL,
"Type" integer NOT NULL,
"Atomic" boolean DEFAULT true,
CONSTRAINT gra_prikey PRIMARY KEY ("Id"),
CONSTRAINT gra_name_ukey UNIQUE ("Name", "FrameId"),
CONSTRAINT gra_frm_fkey FOREIGN KEY ("FrameId")
REFERENCES "Frame" ("Id") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT gra_phr_fkey FOREIGN KEY ("PhraseId")
REFERENCES "Phrase" ("Id") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT gra_typ_fkey FOREIGN KEY ("Type")
REFERENCES "GrammarType" ("Id") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);



CREATE TABLE "GrammarRule"
(
"Id" serial NOT NULL,
"GrammarId" integer NOT NULL,
"Name" character(64) NOT NULL,
"GroupId" integer NOT NULL,
"Left" character(1024) NOT NULL,
"Right" character(1024) NOT NULL,
CONSTRAINT grarul_prikey PRIMARY KEY ("Id"),
CONSTRAINT grarul_name_ukey UNIQUE ("Name"),
CONSTRAINT grarul_gra_fkey FOREIGN KEY ("GrammarId")
REFERENCES "Grammar" ("Id") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE


);


Ma se cancello la Grammar, la GrammarRule non viene cancellata :wat:


E perché nella editbox è tutto indentato mentre nel browser fa cacare ?!? :yuno:
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#88 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 16 maggio 2012 - 10:41

Intendi fare un DROP/TRUNCATE della tabella? Perchè in quel caso IIRC è normale.
Se non è così (e stai facendo il delete di una riga) no.

Per la seconda domanda: se usassi il tag code probabilmente sarebbe tutto indentato anche nel browser :asd:


E comunque per dio basta virgolette ovunque, non servono! :whistler:

Messaggio modificato da MadJackal il 16 maggio 2012 - 10:42

In Soviet Italy, the evil army owns you!

#89 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 16 maggio 2012 - 10:49

Intendi fare un DROP/TRUNCATE della tabella? Perchè in quel caso IIRC è normale.
Se non è così (e stai facendo il delete di una riga) no.


No, faccio una delete di un record.

Per la seconda domanda: se usassi il tag code probabilmente sarebbe tutto indentato anche nel browser :asd:


Il cazzo, se uso il code tag oltre a non poter "boldare", è tutto scazzato (senza indentatura) nella editbox.


E comunque per dio basta virgolette ovunque, non servono! :whistler:


Dillo a quella stronza della pgadmin gui, è lei che ce le mette non io (è sempre colpa di una femmina :pff: ).
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#90 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 16 maggio 2012 - 15:12

No, faccio una delete di un record.


:lnrg:

Non mi quadra proprio per nulla. Non noto errori che possano portare ad un comportamento del genere.
Sorry, mi sa che a sto giro sono inutile. :halone:

Dillo a quella stronza della pgadmin gui, è lei che ce le mette non io (è sempre colpa di una femmina :pff: ).


:whistler: :whistler: :whistler:
In Soviet Italy, the evil army owns you!

#91 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 27 giugno 2012 - 13:06

COPY "Comparisons" ("Id", "Name") FROM stdin;

1 >

2 <

3 =

4 >=

5 <=

6 <>

\.


>> >> >> >> ERROR: invalid input syntax for integer: "1 >"


Colonna "Name" è tipo "text".

How to ?
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#92 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 27 giugno 2012 - 13:09

va beh, ignorate pure... faccio una insert :dumb:
sono stanco ! :yuno:
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#93 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 27 giugno 2012 - 14:12

Comunque il problema è che il delimiter di default è il <TAB>, non lo spazio. :asd:
In Soviet Italy, the evil army owns you!

#94 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 27 giugno 2012 - 14:14

No, il problema è il >
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#95 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 27 giugno 2012 - 15:39

No, il problema è il >


Postgres 8. :dumb: :trollface:
In Soviet Italy, the evil army owns you!

#96 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 27 giugno 2012 - 19:42

Dici che col 9 funziona ?

Comunque stica dai, devo solo popolare un db e lo faccio con le insert che sono anche più leggibili.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#97 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 27 giugno 2012 - 21:09

Dici che col 9 funziona ?

Comunque stica dai, devo solo popolare un db e lo faccio con le insert che sono anche più leggibili.


Ho provato prima di postare sulla 9.1 che ho sul portatile e funziona se do un "tab" come separatore (o se setto il separatore a mano).

Sì sì, sicuramente una insert è più leggibile di una copy.
In Soviet Italy, the evil army owns you!