Bonjour,
J'ai une base de données qui contient quelques tables dont les 2 tables suivantes :
Exemplaire(numero, date_achat, prix, cote_pret, etat, isbn)
Emprunt(num_ab, num_ex, d_emprunt, d_retour, d_ret_reel) avec num_ex qui reference numero de Exemplaire
Premièrement, je souhaite crée un trigger BEFORE qui m'interdit de supprimer un exemplaire de la table lorsque celui ci est en bon état.
J'ai fait ceci:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE OR REPLACE TRIGGER check_exemplaire BEFORE DELETE ON exemplaire FOR EACH ROW WHEN (etat = 'BON') BEGIN RAISE_APPLICATION_ERROR(-20508, 'Suppression d un exemplaire en bon état interdite!'); END IF; END;
Malheureusement, je n'ai pas accès a Oracle et par conséquent je ne peux le tester.
Je voulais savoir si ça vous semblait correct?
Ensuite, je souhaite crée un trigger AFTER qui permet d'interdire un emprunt d'un exemplaire si son état n'est pas bon.
J'ai commencé ça:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE OR REPLACE TRIGGER check_emprunt AFTER INSERT OR UPDATE OF etat ON emprunt FOR EACH ROW DECLARE etatExemplaire exemplaire.etat%TYPE; BEGIN SELECT etat INTO etatExemplaire FROM exemplaire WHERE numero= ??? IF (etatExemplaire <> 'BON') THEN IF INSERTING THEN ??? IF UPDATING THEN ??? END IF; END;
Mais je ne sais pas comment récupérer le numéro de l'exemplaire de la ligne que je suis en train de traiter.
Puis que faire en cas d'insertion ? Je supprime la ligne?
Et en cas de modification?
Enfin, je veux faire un trigger qui lors d'une insertion d'un emprunt, ajoute automatiquement la date d’emprunt et la date de retour:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE OR REPLACE TRIGGER ajout_date_emprunt BEFORE INSERT OF d_emprunt, d_retour ON emprunt FOR EACH ROW WHEN (:new.d_emprunt) IS NULL AND (:new.d_retour) IS NULL BEGIN SELECT SYSDATE INTO :new.d_emprunt FROM emprunt; SELECT SYSDATE+21 INTO :new.d_retour FROM emprunt; END;
Pareil, je ne peux pas le tester sous Oracle.
J'ai essayer avec MySQL en remplacant SYSDATE par NOW() mais ça ne fonctionne pas.
Merci d'avance.
Partager