Newsgroup: it.comp.software.database
Titolo: MySql 5.0.2 e Trigger




...salve a tutti...

Come si gestiscono i trigger con MySql 5.0.2???



da quello che ho letto, sono una nuova
funzionalità di MySql (meno male ) ma non riesco a capire come
utilizzarli!



In pratica ho provato a fare una semplice prova

mi sono creato un db di prova con 2 tabelle

- aggiorna (campi : id,Cognome)

- table_trigger (campi : id, Nome, Cognome)



dopodichè ho associato un trigger alla tabella table_trigger in questo
modo:




CREATE TRIGGER PROVA
  

BEFORE INSERT ON `table_trigger`
  

FOR EACH ROW
  

UPDATE aggiorna

SET NEW.aggiorna.cognome = 'prova';


eseguo lo script e tutto va bene (almeno sembra)


Pero quando vado ad inserire un record in
table_trigger, in aggiorna non succede praticamente nulla...



Con
nessuna interfaccia grafica (phpmyadmin,EMSmanagerLite,Navicat) riesco
a tenere traccia dei trigger. Nel senso una volta creati non so piu che
fine facciano e quindi volendoli modificare devo per forza cancellarli
(ma credo e spero che questa sia una mia mancanza).



Leggendo la documentazione sul sito di MySql 
http://dev.mysql.com/doc/mysql/en/create-trigger.html

mi spiega qualche limitazione che hanno ancora i trigger, ma sono delle
limitazioni che al momento non mi servono.



Qualcuno ha avuto gia a che fare con i trigger in MySQL da potermi
aiutare a capirne meglio il funzionamento?

Grazie Infinite

duffimc








Fino alla 5.0.3 i trigger in MySQL non sono molto piu' di un "segnaposto"
per funzionalita' ancora da aggiungere.
Dalla 5.0.3 in poi, sono state tolte alcune delle limitazioni, e ora si puo'
cominciare a usarli. Vedi questo articolo che spiega la faccenda con molti
dettagli:
http://dev.mysql.com/tech-resources/articles/mysql-triggers.html
A me pare che, fra tutte le funzionalita' introdotte nella 5.0. i triggers
siano ancora la parte piu' acerba, e io non ci farei affidamento per un be po',
soprattutto se li usi all'interno di transazioni in ambiente multi-utente.
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

 multi-utente.
Non avrei dovuto usare i trigger all'interno di transazioni in ambiente 
multi utente, la funzionalità che mi serviva era quella che, inserendo 
un record in una tabella, avrei derivato un'attributo presente in 
un'altra tabella. Tutto qua. Ma da quello che ho letto sul forum 
http://forums.mysql.com/read.php?99,20257
 non si può fare....:(....
Ci sarebbe qualche altro metodo per fare ciò??...altrimenti sono 
costretto ad utilizzare ORACLE per il mio progetto di Basi di Dati per 
l'università. Ho anche provato ad installarlo ORACLE ma nn sono nemmeno 
riuscito a collegarmi al database......
Thanks.


Si puo' fare. Il problema descritto si riferiva alla versione 5.0.2, in cui c'era
ancora la limitazione delle istruzioni SQL nelle function e nei trigger.
L'esempio che segue e' stato eseguito su una 5.0.7 (snapshot), ma dovrebbe funzionare
tranquillamente sulla 5.0.4 di cui cio sono attualmete i binari sul sito diu MySQL.
mysql > select version();
+---------------------------------+
| version()                       |
+---------------------------------+
| 5.0.7-beta-nightly-20050521-log |
+---------------------------------+
1 row in set (0.00 sec)
mysql > describe contatore;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| quanti | int(11) | NO   |     |         |       |
+--------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql > describe test_trig;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI |         |       |
| c     | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql > select * from contatore;
+--------+
| quanti |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)
mysql > select * from test_trig;
Empty set (0.00 sec)
mysql > create trigger prova before insert on test_trig for each row update contatore set quanti = quanti+1;
Query OK, 0 rows affected (0.00 sec)
-- Ora che il trigger e' stato creato, vediamolo all'opera:
-- nota che il LOCK TABLES e' indispensabile per poter eseguire questo
-- tipo di trigger, almeno nella versione attuale.
mysql > lock tables contatore write, test_trig write;
Query OK, 0 rows affected (0.00 sec)
mysql > insert into test_trig values (1, 'xxx');
Query OK, 1 row affected (0.00 sec)
mysql > unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql > select * from contatore;
+--------+
| quanti |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)
mysql > select * from test_trig;
+----+------+
| id | c    |
+----+------+
|  1 | xxx  |
+----+------+
1 row in set (0.00 sec)
Nota comunque che, a dispetto di quel "BETA" scritto nella versione,
i trigger sono da considerare "ALPHA", e da usare ancora con sospetto.


 costretto ad utilizzare ORACLE per il mio progetto di Basi di Dati per
Potresti utilizzare Firebird, i trigger li ha dal 1985....
-- 
Ciao
Marco Kregar
marco....@FirebirdSQL.it
www.FirebirdSQL.it
"over the bench the goat sings, under the bench the goat dies"