Les triggers ou declencheurs | Cours SQL | Programmation SQL | Exercices Corrigés Trigger declencheur

I- DEFINITON
Un déclencheur (trigger) est un type particulier de procédures stockées qui s’exécute automatiquement lorsque vous modifiez, ajoutez ou supprimez des données d’une table.


Les triggers garantissent la cohérence des données liées dans différentes tables : par exemple, un trigger permettra de mettre à jour le NumAvion dans toutes les lignes de la table Affectation liées à un avion que l’on va supprimer dans la table Avion

Chaque trigger est spécifique à certaines opérations sur les données : update, insert ou delete. Il s’exécute immédiatement après l’opération qui l’a lancé. Le trigger et l’opération forment une seule transaction qui peut annulée par le trigger. Si une erreur grave est détectée, toute la transaction est automatiquement annulée.
En langage de base de données une transaction désigne une suite indivisible d’instructions SQL qui s’exécutent toutes ou aucune.

II-        Création d’un Trigger

1-   A l’aide d’Entreprise Manager
·        Cliquez sur le nom de la table
·        Modifier la table
·        Cliquez sur le bouton "déclencheurs".
·        Ecrire (modifier le trigger)
·        Ok



Syntaxe :
CREATE TRIGGER Nom_Trigger ON Nom_Table
FOR INSERT, UPDATE, DELETE
AS
Begin
  Instructions T-Sql
End
1-   2- A l’aide de l’analyseur de requêtes
Ecrire directement le trigger.
Exemples :
Ex1 :
Ecrire un trigger qui vérifie qu’un vol est effectué entre 2 aéroports différents.
create trigger verifie_aero on vol
for insert, update
as
Begin
declare @a1 varchar, @a2 varchar
select @a1=AeroportDept, @a2=AeroportArr from inserted
if @a1=@a2
 begin
   raiserror('l''aeroport de départ doit être différent de l''aeroport d''arrivée',16,1)
   ROLLBACK   -- Annuler la transaction
 end
End

Remarques:
·       INSERTED : est une table temporaire ayant la même structure que la table de base qui contient l’enregistrement à ajouter.
·       DELETED : est une table temporaire ayant la même structure que la table de base qui contient l’enregistrement à supprimer.
·       Au cours d’une modification d’un enregistrement :
-      DELETED contient l’enregistrement avant modification.
-      INSERTED contient l’enregistrement après modification.

Exercices

Soit la base de données Compagnie Aérienne

ÄExercice 1 : sécurisation des suppressions, avec modification en cascade

Dans la table PILOTE, créer un trigger en suppression, qui met à NULL tous les champs IdPilote  de la table AFFECTATION, liés au pilote à supprimer : avec cette méthode, on connaît les vols sans affectation, qui devront être affectés à un autre pilote. Tester le trigger en supprimant un pilote, et en réaffichant la table AFFECTATION.

Les lignes à supprimer sont stockées dans la table temporaire deleted. Pour cet exercice, il faut  supprimer la contrainte de clé étrangère sur la colonne IdPilote de la table AFFECTATION : comme les contraintes de clé étrangère sont évaluées avant le lancement des triggers, le lien entre AFFECTATION et PILOTE interdit la suppression des pilotes référencés dans la table AFFECTATION.

 create trigger supp_pilote on Pilote
  for delete
  as
  begin
  declare @idpilote int
  select @idpilote=idpilote from deleted

  update affectation
  set idpilote=NULL
  where idpilote=@idpilote

 end


ÄExercice 2 : test de cohérence en insertion sur la table VOL
Dans la table VOL, créer un trigger en insertion qui vérifie que la ville d’arrivée est différente de la ville de départ, et que l’heure d’arrivée est postérieur à l’heure de départ. Dans le cas contraire, on annule l’insertion en appelant l’instruction ROLLBACK.


create trigger t7 on Vol for insert
as
begin
  declare @hd int,@ha int,@vd varchar(3),@va varchar(3)

  select @hd=HDepart,@ha=HArrivée,@vd=AeroportDept,@va=AeroportArr
  from inserted

if(@hd>=@ha)
  begin
   raiserror('Erreur! Heure de depart doit être inférieure à l’heure d’arrivée',16,2)
   rollback transaction
return
end

if(@va=@vd)
  begin
   raiserror('Erreur! Aeroport de depart doit être different de l’aeroport d’arrivée',16,2)
   rollback transaction
end
end

ÄExercice 3 : test de cohérence en insertion sur la table AFFECTATION
Interdire à un pilote de voler plus de 35 heures par semaine, par un Trigger en insertion sur la table AFFECTATION.

La somme des heures de vol du pilote pour une semaine représentée par son numéro, est donnée par la procédure Horaire. Cette procédure ne prend pas en compte la nouvelle affectation, qui n’est pas encore dans la table AFFECTATION, mais dans la table provisoire Inserted

create trigger t8 on Affectation for insert
as
begin
declare @id int,@code int
declare @nom varchar(20),@prenom varchar(20),@ns int,@nh int

select @id=IdPilote,@ns=datename(week,DateVol) from inserted

select @nom=NomPilote,@prenom=PrenomPilote
from Pilote where IdPilote=@id

exec Horaire @nom,@prenom,@ns,@code output,@nh output

if(@nh>35)
begin
  raisError('Impossible d affecter à ce pilote encore de vols',16,9)
  rollback transaction
return
end
end



Article plus récent Article plus ancien

Leave a Reply

Telechargement