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

#41 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 18 giugno 2011 - 23:39

Nex, mi sa che ti sbagliavi di grosso.

Si, mi sbagliavo perchè stavo pensando a MSSQL e tu invece mi avevi postato un trigger in MySQL che, per quanto utilizzino entrambi l'SQL, hanno delle differenze di sintassi.

E da quello che mi hai scritto deduco che quel "FOR EACH" è semplicemente una parte della dichiarazione del trigger, io pensavo fosse un ciclo all'interno dello stesso.
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...

#42 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 19 giugno 2011 - 08:52


Ma lo penso anch'io, il problema è: come lo scrivo nella relazione del progetto? :wink:
Nella sezione "vincoli d'integrità" dovrò dire che i vincoli vengono controllati da php, il che è concettualmente strasbagliato :yeah:

Scriverò tipo "visto i limiti di mysql (niente check, niente raise_application_error, etc), il controllo sui vincoli di integrità, quando non risolvibili tramite applicazione di valori di default via trigger, viene fatta da php", boh :megusta:


Ma per il progetto di basi di dati non era fortemente consigliato usare PostgreSQL?
Almeno, dalle mie parti era così (nonostante qualcuno fosse andato dal professore a chiedergli se poteva usare wordpress :gay:)


avevo già letto prima di aprire il topic, non ci sono esempi di trigger con il for each row e variabili dichiarate/inizializzate fuori ;)


Ma infatti hai ragione tu a metterlo dentro, perchè non si può mettere fuori sotto MySQL.

DECLARE is permitted only sta gran ceppa di minchia terrona a BEGIN ... END compound statement and must be at its start, before any other statements.

:lnrg:

Solitamente in pl/pgsql o pl/sql il declare sta "prima" del begin della funzione.


Questa mi mancava... pensavo che si interfacciasse al sql server, non che ne avesse uno suo :trollface:

edit: Anche perché proprio di recente ho dovuto "designare" il nostro "gestore progetti" ed un'alternativa era proprio python + postgres. Non ho trovato nulla che parlasse di python sql server.


Parlavo proprio di PostgreSQL, non c'è nessun "python sql server". :asd:
Il problema della versione ufficiale di plpython è che ha problemi seri con gli errori, tra l'altro... Però ce ne sta una versione python3 only piuttosto completa (e vuoi mettere python contro pl/sql in fatto di completezza del linguaggio? ;)).
In Soviet Italy, the evil army owns you!

#43 trallallero

trallallero

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.188 Messaggi:

Inviato 19 giugno 2011 - 09:32

Il "for each ..." è ansi sql non è che mysql lo faccia a modo suo.
Se fai una insert di 100 records, il "for each" dice appunto "per ogni record inserito".
Per questo si deve mettere la declare dentro e non fuori visto che il trigger crea una funzione che verrà chiamata per ogni record. Quando si scrive un trigger bisogna immaginare cosa creerà il trigger che non è proprio quello che scriviamo noi.
Don't worry, faith will come soon, like a recall but,
if you can't wait, just stop thinking at all 

 


#44 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 19 giugno 2011 - 12:03

Il "for each ..." è ansi sql non è che mysql lo faccia a modo suo.
Se fai una insert di 100 records, il "for each" dice appunto "per ogni record inserito".
Per questo si deve mettere la declare dentro e non fuori visto che il trigger crea una funzione che verrà chiamata per ogni record. Quando si scrive un trigger bisogna immaginare cosa creerà il trigger che non è proprio quello che scriviamo noi.

Mi riferivo all'uso di "AS" che in MySQL non c'è...

Il discorso dei DECLARE dentro al ciclo l'avevo già spiegato sopra.
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...

#45 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 19 giugno 2011 - 12:50

?[/url]":pm2focvt]
Ma lo penso anch'io, il problema è: come lo scrivo nella relazione del progetto? :wink:
Nella sezione "vincoli d'integrità" dovrò dire che i vincoli vengono controllati da php, il che è concettualmente strasbagliato :lnrg:

Scriverò tipo "visto i limiti di mysql (niente check, niente raise_application_error, etc), il controllo sui vincoli di integrità, quando non risolvibili tramite applicazione di valori di default via trigger, viene fatta da php", boh :yeah:


Ma per il progetto di basi di dati non era fortemente consigliato usare PostgreSQL?
Almeno, dalle mie parti era così (nonostante qualcuno fosse andato dal professore a chiedergli se poteva usare wordpress :gay:)



Noi lo dobbiamo fare obbligatoriamente in mysql, sul server dell'uni.


Figurati che il server è raggiungibile solo dal lab dell'uni, dovrei essere là per farlo :trollface:


Sto sfruttando un altro hosting, poi esporto tutto là il giorno prima della consegna


Inb4 l'import non funziona e rimando l'esame a luglio :megusta:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#46 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 19 giugno 2011 - 12:51

?[/url]":3hhsvee5]

Ma per il progetto di basi di dati non era fortemente consigliato usare PostgreSQL?
Almeno, dalle mie parti era così (nonostante qualcuno fosse andato dal professore a chiedergli se poteva usare wordpress :megusta:)



Noi lo dobbiamo fare obbligatoriamente in mysql, sul server dell'uni.


Figurati che il server è raggiungibile solo dal lab dell'uni, dovrei essere là per farlo :lnrg:


Sto sfruttando un altro hosting, poi esporto tutto là il giorno prima della consegna


Inb4 l'import non funziona e rimando l'esame a luglio :yeah:


Esportati un dump SQL con create e insert :trollface:

#47 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 19 giugno 2011 - 12:58

?[/url]":12otqrfh]


Noi lo dobbiamo fare obbligatoriamente in mysql, sul server dell'uni.


Figurati che il server è raggiungibile solo dal lab dell'uni, dovrei essere là per farlo :lnrg:


Sto sfruttando un altro hosting, poi esporto tutto là il giorno prima della consegna


Inb4 l'import non funziona e rimando l'esame a luglio :yeah:


Esportati un dump SQL con create e insert :trollface:



sisi era quella l'intenzione, ne ho fatto prima uno di prova... esporta tutto tranne le stored procedures (i trigger sì).. ma non è un problema, le ho salvate a parte

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#48 MadJackal

MadJackal

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStelletta
  • 3.105 Messaggi:

Inviato 19 giugno 2011 - 13:09


Noi lo dobbiamo fare obbligatoriamente in mysql, sul server dell'uni.


Cioè, aspetta, dovete mettere dei vincoli d'integrità su un db che non li supporta?
Sicuro che non si riferiscano solamente a chiavi primarie/uniche?
In Soviet Italy, the evil army owns you!

#49 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 19 giugno 2011 - 13:14

?[/url]":2l86meib]
Noi lo dobbiamo fare obbligatoriamente in mysql, sul server dell'uni.


Cioè, aspetta, dovete mettere dei vincoli d'integrità su un db che non li supporta?
Sicuro che non si riferiscano solamente a chiavi primarie/uniche?


Bah, è vago, non è neanche scritto che dobbiamo, lo faccio perchè sarebbe imho stupido NON FARLO.

Se vi fossero altri vincoli ritenuti significativi se ne può dare una descrizione testuale o in linguaggio semi-formale, come visto a lezione.


Come implementazione di SQL andrà utilizzato il sistema MySQL



Ma vabè, faccio i controlli da php e ceste.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#50 Sgurbat

Sgurbat

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 9.772 Messaggi:

Inviato 28 giugno 2011 - 18:37

[quote name="trallallero ?":11i474u4] [quote name='"MadJackal ?":11i474u4]Torno a scrivere trigger in python' date=' semmai. :trollface: [/quote']
Famosissimo server sql :ncasd:[/quote]

Cristo santo!

Immagine inserita

We are what we repeatedly do. Excellence, then, is not an act, but a habit. (Aristotele)


#51 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 15 giugno 2011 - 18:28

allora,
CREATE TRIGGER tr_ins_animale BEFORE INSERT ON Animali

	FOR EACH ROW

	BEGIN 

	DECLARE foo INT;

	IF(NEW.data_arrivo > CURDATE())

		select 'la data di inserimento non può essere maggiore di quella odierna' into foo; 

	END IF;

	END;


è un trigger che fa finta di fare il raise_application_error degli altri dbms in mysql, alla fine dovrebbe buttare fuori un errore del genere "invalid integer value: "la data di inserimento non può essere maggiore di quella odierna", bloccando l'inserimento.


Ma mi da errore di sintassi, dove lo vedete voi?


Inb4 manca una semicolon

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#52 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 15 giugno 2011 - 18:30

mancava il then :sisi:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#53 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 15 giugno 2011 - 18:45

Lancia un warning e inserisce lo stesso :sisi:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#54 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 15 giugno 2011 - 19:00

si ma ti basta un check, sei scemo?

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#55 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:02

La DECLARE dentro al ciclo FOR è una chicca...

:sisi:
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...

#56 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 15 giugno 2011 - 19:04

La DECLARE dentro al ciclo FOR è una chicca...

:sisi:


Mai usati i trigger, ma tecnicamente quello non è un vero e proprio ciclo for o sbaglio ?

#57 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:05

Non sbagli, ma io non avrei mai messo la DECLARE lì dentro...
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...

#58 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 44.023 Messaggi:

Inviato 15 giugno 2011 - 19:18

Non sbagli, ma io non avrei mai messo la DECLARE lì dentro...



guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :sisi:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#59 LilithSChild

LilithSChild

    Schiavo

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.764 Messaggi:

Inviato 15 giugno 2011 - 19:20

[quote name="toyo ?":3tazankl] [quote name='"Nex ?":3tazankl] Non sbagli' date=' ma io non avrei mai messo la DECLARE lì dentro...[/quote']


guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :sisi:[/quote]

in b4 caricamento ODI/SSIS con tabella da 30 milioni di record per 150 campi.

#60 Nex

Nex

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 19.500 Messaggi:

Inviato 15 giugno 2011 - 19:23

guarda che non è un for, è un "fai sta roba per tutte le righe che vengono cambiate", e di solito è una sola :sisi:

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...
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...