abdelouafi
Administrator
إذا كنت ترغب في مشاهدة الصور ، يرجى النقر عليها
Blog
SUIVEZ NOTRE CHAINE YOUTUBE: قم بالتسجيل في قناتنا عبر هذا الرابط https://www.youtube.com/channel/UCCITRMWPcElh-96wCS3EyUg
devoir 1 math tronc commun
مجموعة من دروس و فروض جميع المستويات
دروس الإعدادي - دروس الثانوي الثأهيلي - دروس التعليم الابتدائي - فروض مختلف المستويات الدراسيةفضلا و ليس أمرا شارك هذه الصفحة مع أصدقائك:
Les déclencheurs : Triggers
Déclencheur ligne « row trigger »
Déclencheur s'exécute pour chaque ligne
Accès aux anciennes et aux nouvelles valeurs
- :OLD.colonne ancienne valeur
- :NEW.colonne nouvelle valeur
- OLD permet de connaître la ligne en cours de suppression dans un trigger DELETE ou la ligne avant modification dans un trigger UPDATE.
- NEW permet de connaître la nouvelle ligne insérée dans un trigger INSERT ou la ligne après modification dans un trigger UPDATE
Exemple d’un déclencheur ligne : Mise à jour automatique du nombre du vol
1. Ajouter le champ Nbrevol à la table Pilote initialisé à 0 puis afficher ses lignes .
2. Créer le déclencheur INSERT_VOL.
3. Insérer un vol puis afficher les lignes la table pilote.
alter table pilote ADD (nbrevol integer default 0);
CREATE OR REPLACE TRIGGER INSERT_VOL AFTER INSERT ON Vol FOR EACH ROW BEGIN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :NEW.npilote; END INSERT_VOL; /
insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE);
Exemple d’un déclencheur ligne : Un pilote ne doit pas effectuer 2 vols par jour.
CREATE OR REPLACE TRIGGER Nombre_Vol BEFORE INSERT ON Vol FOR EACH ROW DECLARE Nbre Number; BEGIN select Count(*) into Nbre from Vol WHERE npilote = :NEW.npilote AND DateV='03/03/89'; If Nbre>=1 then RAISE_APPLICATION_ERROR(-20101, 'Le pilote numéro ' || :NEW.npilote || ' a déjà un vol' ); End if; END; /
insert into vol values (95,1,2,'Rak','Fes','0815','1020','03/03/89'); Commit;
ERREUR à la ligne 1 : ORA-20101: Le pilote numéro 1 a déjà un vol ORA-04088: erreur lors d'exécution du déclencheur 'NOMBRE_VOL'
Regroupement d’événements
On peut programmer des conditions
Cas d’une insertion IF INSERTING THEN …
Cas d’une mise à jour IF UPDATING(‘colonne ’) THEN …
Cas d’une suppression IF DELETING THEN …
Regroupement possible dans un seul déclencheur
CREATE OR REPLACE TRIGGER REG_EVENEMENT AFTER INSERT OR DELETE ON Vol REFERENCING OLD AS LigneAvant NEW AS LigneApres FOR EACH ROW BEGIN IF INSERTING THEN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :LigneApres.npilote; END IF; IF DELETING THEN UPDATE Pilote SET Nbrevol = Nbrevol - 1 WHERE npilote = :LigneAvant.npilote; END IF; END REG_EVENEMENT; /
insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE); delete from vol Where nvol=92 and npilote=2;
Principe :
Raisonnement global sur la table
Pas sur un enregistrement particulier
Exemple : Ne permet pas la modification du numéro de pilote et de l’avion dans la table Vol.
CREATE OR REPLACE TRIGGER Exemple_Statement BEFORE UPDATE OF Npilote, Navion ON Vol BEGIN RAISE_APPLICATION_ERROR(-20102, 'Cette modification est interdite dans la table vol'); END Exemple_Statement; /
SQL> update vol set npilote=9 where nvol=100;
Suppression
DROP TRIGGER NomDéclencheur ;
Désactivation
ALTER TRIGGER NomDéclencheur DISABLE ;
Réactivation
ALTER TRIGGER NomDéclencheur ENABLE ;
Désactivation/réactivation de tous les déclencheurs d ’une table
ALTER TABLE NomTable { ENABLE | DISABLE } ALL TRIGGERS ;
Principe Déclencheur dont le corps s'exécute « à la place de » l’événement déclenchant Uniquement dans le cadre de déclencheur ligne Le déclencheur INSTEAD OF permet l’insertion, la modification et la suppression de lignes à travers une vue basée sur plusieurs tables qui pourrait être autrement non modifiable car la vue est le résultat d’une jointure.
Syntaxe
CREATE [OR REPLACE] TRIGGER nomtrigger INSTEAD OF {DELETE|INSERT|UPDATE [OF colonne1 ,…]} ON NomVue FOR EACH ROW [DECLARE] -- déclaration de variables BEGIN -- instruction SQL et PL/SQL END [nomtrigger]; /
Déclencheur ligne « row trigger »
Déclencheur s'exécute pour chaque ligne
Accès aux anciennes et aux nouvelles valeurs
- :OLD.colonne ancienne valeur
- :NEW.colonne nouvelle valeur
- OLD permet de connaître la ligne en cours de suppression dans un trigger DELETE ou la ligne avant modification dans un trigger UPDATE.
- NEW permet de connaître la nouvelle ligne insérée dans un trigger INSERT ou la ligne après modification dans un trigger UPDATE
Exemple d’un déclencheur ligne : Mise à jour automatique du nombre du vol
1. Ajouter le champ Nbrevol à la table Pilote initialisé à 0 puis afficher ses lignes .
2. Créer le déclencheur INSERT_VOL.
3. Insérer un vol puis afficher les lignes la table pilote.
alter table pilote ADD (nbrevol integer default 0);
CREATE OR REPLACE TRIGGER INSERT_VOL AFTER INSERT ON Vol FOR EACH ROW BEGIN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :NEW.npilote; END INSERT_VOL; /
insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE);
Exemple d’un déclencheur ligne : Un pilote ne doit pas effectuer 2 vols par jour.
CREATE OR REPLACE TRIGGER Nombre_Vol BEFORE INSERT ON Vol FOR EACH ROW DECLARE Nbre Number; BEGIN select Count(*) into Nbre from Vol WHERE npilote = :NEW.npilote AND DateV='03/03/89'; If Nbre>=1 then RAISE_APPLICATION_ERROR(-20101, 'Le pilote numéro ' || :NEW.npilote || ' a déjà un vol' ); End if; END; /
insert into vol values (95,1,2,'Rak','Fes','0815','1020','03/03/89'); Commit;
ERREUR à la ligne 1 : ORA-20101: Le pilote numéro 1 a déjà un vol ORA-04088: erreur lors d'exécution du déclencheur 'NOMBRE_VOL'
Regroupement d’événements
On peut programmer des conditions
Cas d’une insertion IF INSERTING THEN …
Cas d’une mise à jour IF UPDATING(‘colonne ’) THEN …
Cas d’une suppression IF DELETING THEN …
Regroupement possible dans un seul déclencheur
CREATE OR REPLACE TRIGGER REG_EVENEMENT AFTER INSERT OR DELETE ON Vol REFERENCING OLD AS LigneAvant NEW AS LigneApres FOR EACH ROW BEGIN IF INSERTING THEN UPDATE Pilote SET Nbrevol = Nbrevol + 1 WHERE npilote = :LigneApres.npilote; END IF; IF DELETING THEN UPDATE Pilote SET Nbrevol = Nbrevol - 1 WHERE npilote = :LigneAvant.npilote; END IF; END REG_EVENEMENT; /
insert into vol values (92,2,2,'Rak','Fes','0815','1020',SYSDATE); delete from vol Where nvol=92 and npilote=2;
Principe :
Raisonnement global sur la table
Pas sur un enregistrement particulier
Exemple : Ne permet pas la modification du numéro de pilote et de l’avion dans la table Vol.
CREATE OR REPLACE TRIGGER Exemple_Statement BEFORE UPDATE OF Npilote, Navion ON Vol BEGIN RAISE_APPLICATION_ERROR(-20102, 'Cette modification est interdite dans la table vol'); END Exemple_Statement; /
SQL> update vol set npilote=9 where nvol=100;
Suppression
DROP TRIGGER NomDéclencheur ;
Désactivation
ALTER TRIGGER NomDéclencheur DISABLE ;
Réactivation
ALTER TRIGGER NomDéclencheur ENABLE ;
Désactivation/réactivation de tous les déclencheurs d ’une table
ALTER TABLE NomTable { ENABLE | DISABLE } ALL TRIGGERS ;
Principe Déclencheur dont le corps s'exécute « à la place de » l’événement déclenchant Uniquement dans le cadre de déclencheur ligne Le déclencheur INSTEAD OF permet l’insertion, la modification et la suppression de lignes à travers une vue basée sur plusieurs tables qui pourrait être autrement non modifiable car la vue est le résultat d’une jointure.
Syntaxe
CREATE [OR REPLACE] TRIGGER nomtrigger INSTEAD OF {DELETE|INSERT|UPDATE [OF colonne1 ,…]} ON NomVue FOR EACH ROW [DECLARE] -- déclaration de variables BEGIN -- instruction SQL et PL/SQL END [nomtrigger]; /
Attachments
Last edited: