Vai al contenuto


Foto

[MySQL] Problema stupido con trigger


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

#61 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 19:26

[quote name="Nex ?":3rnh5ub6] [quote name='"toyo ?":3rnh5ub6]guarda che non è un for' date=' è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :sisi:[/quote']
A parte che non è esattamente così, comunque l'avevo scritto sopra.

Il punto è che a livello logico è sbagliato e se fai 'ste cappellate poi ti capita di infilarle anche nel codice normale...[/quote]

ok, ma per una roba così
CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

FOR EACH ROW

	BEGIN

	DECLARE prezzo_n FLOAT;

	DECLARE prezzo_ns FLOAT;

	DECLARE prezzo_r FLOAT;

	DECLARE prezzo_rs FLOAT;

	DECLARE prezzo_c FLOAT;

	DECLARE prezzo_cs FLOAT;

	DECLARE totale FLOAT;

	SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

	SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

	SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

	SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

	SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

	SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

	SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

	END;

come fai senza i declare?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#62 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 20:29

Li metti subito dopo la CREATE TRIGGER e fuori dal ciclo.
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#63 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 22:33

Li metti subito dopo la CREATE TRIGGER e fuori dal ciclo.


ah si può? in tutti gli esempi che ho visto il for each era sempre sotto il create trigger.

provo subito.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#64 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 22:38

intendi così giusto?

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

  DECLARE prezzo_n FLOAT;

  DECLARE prezzo_ns FLOAT;

  DECLARE prezzo_r FLOAT;

  DECLARE prezzo_rs FLOAT;

  DECLARE prezzo_c FLOAT;

  DECLARE prezzo_cs FLOAT;

  DECLARE totale FLOAT;

  SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

  SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

  SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

  SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

  SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

  SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

   FOR EACH ROW

   BEGIN

   SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

   END;


o serve un altro begin/end?

magari è una domanda straniubba ma iniziato stamattina con pl/sql

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#65 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 22:43

Le DECLARE stanno fuori dal ciclo, ma le SELECT devono stare dentro, altrimenti non funziona niente.

I BEGIN/END li usi solo per i cicli, gli IF/CASE o quando inizi una transazione, ecc...

E solo se ci sono più righe di istruzione, altrimenti puoi fare senza, es:

IF @MY_VAR = 'Ciao' THEN SET @YOUR_VAR = 'Ok'
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#66 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 22:53

Ok grazie.
Ma se posso dichiarare una variabile fuori dal ciclo, perché non posso inizializzarla?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#67 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 22:57

Puoi inizializzarle dove vuoi, ma in questo caso specifico non sapendo se la tabella "BIGLIETTI" ha dei dati che non sono influenzati dal trigger che stai lanciando o comunque che non mutano mentre il trigger viene innescato, conviene mettere le SELECT dentro.

Mi spiego: mettiamo che il TRIGGER parta per ogni UPDATE che fai. Se le tue SELECT vanno a testare le stesse UPDATE e tu le mettessi fuori dal ciclo, nel caso in cui il ciclo agisse su più ROW modificate, avresti una situazione incoerente...

Dipende quindi dai casi.
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#68 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 23:03

Puoi inizializzarle dove vuoi, ma in questo caso specifico non sapendo se la tabella "BIGLIETTI" ha dei dati che non sono influenzati dal trigger che stai lanciando o comunque che non mutano mentre il trigger viene innescato, conviene mettere le SELECT dentro.

Mi spiego: mettiamo che il TRIGGER parta per ogni UPDATE che fai. Se le tue SELECT vanno a testare le stesse UPDATE e tu le mettessi fuori dal ciclo, nel caso in cui il ciclo agisse su più ROW modificate, avresti una situazione incoerente...

Dipende quindi dai casi.


ah ok, ma nel caso in cui viene richiamato questo trigger(che è sull'update di Storico_vendite, non Biglietti), la tabella biglietti ha sempre gli stessi valori (per motivi intrinsechi a come è progettato il mio zoo :sisi: )

quindi lo lascio fuori, grazie ancora

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#69 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 15 giugno 2011 - 23:07

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

DECLARE prezzo_n FLOAT;

DECLARE prezzo_ns FLOAT;

DECLARE prezzo_r FLOAT;

DECLARE prezzo_rs FLOAT;

DECLARE prezzo_c FLOAT;

DECLARE prezzo_cs FLOAT;

SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

FOR EACH ROW

	BEGIN

	SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

	END;


errore di sintassi alla riga 2 :sisi:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#70 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 16 giugno 2011 - 08:33

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

AS

DECLARE ...
...
Then I went to my pretty rose tree / To tend her by day and by night / But my rose turned away with jealousy / And her thorns were my only delight...

#71 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 18 giugno 2011 - 18:27

Il problema stupido è usare MySQL :poker: :trollface:




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

#72 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 18 giugno 2011 - 18:28

Il problema stupido è usare MySQL :poker: :trollface:




:patpat:


Sto cazzo.

#73 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 18 giugno 2011 - 18:50

Sto cazzo.


Sto cazzo un cazzo. :patpat:
In Soviet Italy, the evil army owns you!

#74 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 18 giugno 2011 - 18:52

?[/url]":is89ncil]Sto cazzo.


Sto cazzo un cazzo. :poker:


torna a giocare con gli archivi. :patpat:

#75 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 18 giugno 2011 - 19:00

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

DECLARE prezzo_n FLOAT;

DECLARE prezzo_ns FLOAT;

DECLARE prezzo_r FLOAT;

DECLARE prezzo_rs FLOAT;

DECLARE prezzo_c FLOAT;

DECLARE prezzo_cs FLOAT;

SELECT prezzo FROM Biglietti WHERE tipo="normale" into prezzo_n;

SELECT prezzo FROM Biglietti WHERE tipo="normale_s" into prezzo_ns;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto" into prezzo_r;

SELECT prezzo FROM Biglietti WHERE tipo="ridotto_s" into prezzo_rs;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva" into prezzo_c;

SELECT prezzo FROM Biglietti WHERE tipo="comitiva_s" into prezzo_cs;

FOR EACH ROW

	BEGIN

	SET NEW.incasso=(prezzo_n*NEW.normale) + (prezzo_ns*NEW.normale_s) + (prezzo_r*NEW.ridotto) + (prezzo_rs*NEW.ridotto_s) + (prezzo_c*NEW.comitiva) + (prezzo_cs*NEW.comitiva_s);

	END;


errore di sintassi alla riga 2 :poker:

Si ma toyo, googlare un esempio di trigger sql prima di fare domande qui, no ? :patpat:
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#76 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 18 giugno 2011 - 19:01

Il problema stupido è usare MySQL :poker: :trollface:




:patpat:

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

 


#77 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 18 giugno 2011 - 19:20

torna a giocare con gli archivi. :trollface:


Torno a scrivere trigger in python, semmai. :patpat:
Per il resto mi dispiace, ma MySQL non è ancora abbastanza avanzato per me (partendo dall'orribile "uno schema -> un database", con database e schema visti come intercambiabili) - nonostante si siano ormai da un annetto resi conto che non era il caso di mettere come motore di default MyISAM... :poker:


Poi oh, a, mentre mia madre succhia cazzi, ognuno il suo :poker:
In Soviet Italy, the evil army owns you!

#78 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 18 giugno 2011 - 19:22

?[/url]":jn38fyd5] torna a giocare con gli archivi. :trollface:


Torno a scrivere trigger in python, semmai. :patpat:
Per il resto mi dispiace, ma MySQL non è ancora abbastanza avanzato per me (partendo dall'orribile "uno schema -> un database", con database e schema visti come intercambiabili) - nonostante si siano ormai da un annetto resi conto che non era il caso di mettere come motore di default MyISAM... :poker:


Poi oh, a, mentre mia madre succhia cazzi, ognuno il suo :poker:


per quello a cui serve è più che buono, a, mentre mia madre succhia cazzi, ogni compito il suo strumento, e se da sviluppatore ancora non hai capito sta semplice regola stai messo male.

#79 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.066 Messaggi:

Inviato 18 giugno 2011 - 19:56

CREATE TRIGGER tr_incasso BEFORE UPDATE ON Storico_vendite

AS

DECLARE ...
...



non funziona :trollface:, sempre errore di sintassi a riga 2


fc, lo lascio com'è, per il tempo che abbiamo fatto i trigger (1 lezione) non mi stanno a rompere il cazzo per i declare dentro al for each.





Ah ma avete idea di perchè Mysql saltì a piè pari i CHECK? :poker:


non sono scemo io eh,

As the MySQL Reference Manual says:
"The CHECK clause is parsed but ignored by all storage engines."




cioè non mi pare una cosina da niente :patpat:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#80 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 18 giugno 2011 - 20:11

Ah ma avete idea di perchè Mysql saltì a piè pari i CHECK? :poker:

non sono scemo io eh,

As the MySQL Reference Manual says:
"The CHECK clause is parsed but ignored by all storage engines."


cioè non mi pare una cosina da niente :poker:


Easy, non sono supportati.
Le constraint al massimo puoi metterle nel codice, a che serve metterle nel DB? :patpat:
Al massimo hai un controllo di validità sul dato che metti nel campo, ma non è detto visto che il controllo non è abilitato di default - l'azione standard prevede che il valore venga trasformato in qualcosa di valido, senza errori. :okay:


per quello a cui serve è più che buono, a, mentre mia madre succhia cazzi, ogni compito il suo strumento, e se da sviluppatore ancora non hai capito sta semplice regola stai messo male.


Ho aggiunto appunto la nota in fondo a quanto ho scritto perchè tutto dipende da cosa è richiesto al db: per un semplice data storage su cui si usa un qualche ORM va tutto bene, non si ha bisogno di un db relazionale. :trollface:
Comunque io avrei paura per le tabelle di "sistema" con MySQL...
In Soviet Italy, the evil army owns you!