Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Basi di dati ~ informatica triennale
 
Aiuto Esercizio Sui Triggere Con Mysql
Clicca QUI per vedere il messaggio nel forum
fra85
salve ragazzi,sto postando il mio esercizio così magari mi potete aiutare meglio,spero :).
Allora devo implementare un vincolo per il mio progetto.Avendo la tabella iscritto:

CREATE TABLE iscritto(
codice_fiscale VARCHAR(20) NOT NULL PRIMARY KEY,
data_di_nascita DATE ,
nome VARCHAR(20) NOT NULL,
cognome VARCHAR(20) NOT NULL,
indirizzo VARCHAR(30) NOT NULL,
costo_abbonamento DECIMAL(10,2),
numero_socio INT NOT NULL,
data_fine_abbonamento DATE,
data_inizio_abbonamento DATE
);


Dovrei implementare il vincolo che un iscritto deve avere dai 18 ai 90 anni.Uso i trigger dato che mysql ignora i chek.

Io ho provato a creare questo(anche se non ho capito bene la funzione del delimiter):

DELIMITER //
create trigger aggiorna_iscritti
after insert on iscritto
for each row
begin
declare eta int;
SET eta= YEAR(CURDATE()) - YEAR(NEW.data_di_nascita);
if eta < 18 then
if eta > 90 then
delete from iscritto where data_di_nascita= NEW.data_di_nascita;
end if;
end if;
end ;//

Mi dice che è corretto,però poi provo a inserire qualche elemento nella tabella e mi dice una cosa del genere:

mysql>INSERT ... ecc....;
-->

come se mi richiede qualcos'altro e non capisco,perchè?
Forse appunto perchè non ho capito come funziona il delimiter...

Qualcuno può aiutarmi?????
Grazie mille.

number15
Intanto io gestirei il tutto da input, cioè dal tuo programma fai che non puoi mettere età < 18 o > 90.

Per quanto riguarda il trigger, di base la struttura è questa:

code:
DELIMITER $$ CREATE TRIGGER ... AFTER INSERT ON ... FOR EACH ROW BEGIN IF .... END IF; END; $$ DELIMITER ;


Il tuo trigger sicuramente in sto punto è sbagliato:
if eta < 18 then
if eta > 90 then

son in contrasto tra di loro. Se vuoi devi ripetere la delete e chiudere l'if. ALtrimenti (più giusto) devi fare qualcosa con l'OR (eta < 18 or eta > 90).

Inoltre eviterei anche tutta la parte della dichiarazione, andando direttamente se l'anno attuale - l'anno di nascita < 18 o .... maggiore di 90.

Quando cancelli utilizza cmq la chiave (where cf = nef.cf)

Tra l'altro ti consiglio di aggiungere un id_iscritto di tipo int auto_increment da usare come PK e metti codice_fiscale come UNIQUE.

Comunque ripeto, a meno che sia espressamente richiesto, un trigger per il controllo dell'età mi pare folle.

fra85
Si mi è stato richiesto di implementare il vincolo.OK provo a sistemarlo e vediamo

number15
Chiedi al prof comunque, per me non è giusto usare un trigger.
TI chiede vincolo a livello sql?
Perché è puoi fare vincolo applicativo e funziona uguale (anzi meglio)

fra85
Ho provato a rifarlo.Ho cancellato il vecchio trigger e ho inserito quello nuovo:

DELIMITER //
create trigger aggiorna_iscritti
after insert on iscritto
for each row begin
declare eta int;
SET eta= YEAR(CURDATE()) - YEAR(NEW.data_di_nascita);
if (eta < 18 and eta > 90) then
delete from iscritto where codice_fiscale= NEW.codice_fiscale;
end if;
end ;
//

non ho neanche il tempo di scrivere DELIMITER; infatti dopo il codice mi compare:
query ok, 0 rows affected (0.17 sec)

poi provo a farlo ora delimiter:
mysql> DELIMITER;
->

e siamo dinuovo così,come se mi richiedesse qualcosa ancora.Sono le prime volte che faccio i trigger quindi ancora so quasi niente :?

number15
if (eta < 18 and eta > 90) then

questo è sbalgiato, metti l'or.

Ma comunque parti da un trigger base.
After insert on iscritto setti un campo a scelta tua (es. nome = pippo).

E vedi se funziona. Poi vai a cambiare la struttura per quello che devi fare, ma almeno vedi come funziona.

fra85
Siccome devo fare un'integrazione,mi richiede di implementare tre vincoli tramite check,asserzioni o trigger(c'è scritto).boh

number15
Asserzione non so cosa intenda :D.

Le check puoi metterle, poi mysql se ne frega ma tu il vincolo l'hai messo.
In postgres mi pare funzionino.

Se hai possibilità di sentire il prof, chiedi se puoi implementare il vincolo a livello applicativo.

Ovviamente poi avrai altri trigger da implementare, quindi la discussione ti è utile uguale, ma lascerei perdere questo.

fra85
il primo l'ho implementato con il check ed è corretto,solo che mysql lo ignora :):( peggio per lui :-D:D

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate