Bonjour,
Je suis sur Oracle 10g express edition.
J'ai une base de données d'une entreprise de sous-titrage pour lequel on doit spécifier un lieu de stockage une fois le travail effectué: en magasin ou sur serveur (c'est un exercice).
Je cherche a créer un déclencheur qui assure que tout travail effectué est stocké au moins d'une des deux façons.
J'ai décidé qu'on pouvait insérer dans la table sous_titres les données permettant de l'identifier si le travail n'est pas fini (attribut "fait" = non). On peut spécifier ensuite un lieu de stockage et une fois le travail fait, on update "fait" à oui, ce qui déclenche le trigger pour vérifier que le travail a bien un lieu de stockage.
Mon problème est que dans ce trigger je n'arrive pas à récupérer les valeurs de "titre", "année" de la ligne mise à jour pour chercher dans les relations Serveur et Magasin si le travail de sous-titrage est bien effectué
J'ai l'impression qu'en updatant seulement "fait" :new ne contient pas les valeurs des champs "titre" et "année" de la ligne mise a jour. Je récupère toujours l'exception no_data_found.
Est-ce que je m'y prends mal pour résoudre le problème ou est-ce mon déclencheur qui est mal codé?
Faire un select into pour voir si une valeur donnée se trouve dans la table et conclure que si rien n'est sélectionné n'est sûrement pas la meilleure façon de s'y prendre, comment vérifier que le sous titre identifier par le titre l'année et un num-soustitre est présent dans Magasin ou Serveur?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 CREATE OR REPLACE TRIGGER Ctrl_Mag_Serv AFTER UPDATE ON Sous_titre FOR EACH ROW DECLARE Vnumero_sous VARCHAR2(8); BEGIN Vnumero_sous:='rien' IF :new.fait = 'oui' THEN SELECT numero_sous INTO Vnumero_sous FROM Magasin WHERE Magasin.titre_original = :NEW.titre_original AND Magasin.Annee = :NEW.annee; SELECT numero_sub INTO Vnumero_sub FROM Serveur WHERE Serveur.titre_original = :new.titre_original AND Serveur.Annee = :new.annee; IF vnumero_sous IS NULL THEN RAISE_APPLICATION_ERROR(-20000, 'Impossible de trouver le sous-titre en magasin ou serveur, d'abord spécifier un lieu de stockage avant de mettre à jour l'attribut fait '); END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('Pas trouvé.'); END Ctrl_Almac;
J'ai aussi fait un déclencheur qui interdit d'insérer une ligne contenant fait=oui, qui fonctionne.
Merci de votre attention
edit : dans la section Oracle peut-être?