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.