Vous êtes sur la page 1sur 30

Bases de donnes avances

Les dclencheurs (triggers)

Dfinition de contraintes CREATE TRIGGER (Oracle)

Tables temporaires :new / :old


Lors d'une insertion, suppression ou modification Oracle utilise implicitement les tables temporaires :new et :old. Suite une insertion <table> = <table> Union :new Suite une suppression <table> = <table> Minus :old Suite une modification <table> = <table> Minus :old Union :new
3

Contrainte temporelle clause CREATE TRIGGER


no NUMERIC, CREATE TRIGGER trigsal sal NUMERIC BEFORE UPDATE OF sal ) ON job FOR EACH ROW BEGIN IF (:new.sal < :old.sal) THEN raise_application_error(-20001,'Le salaire ne peut pas baisser'); END IF; END;

spcifie comment doivent voluer les donnes lors d'une mise jour CREATE TABLE JOB (

. RUN

PL/SQL structure de bloc


Langage structur en blocs
DECLARE . . . BEGIN . . . END;

PL/SQL Variables et constantes


Dclaration
DECLARE <varname> <type>; <constname> CONSTANT <type> := <value>;

Assignation des variables


<varname> := <value>; <varname> := <expression>;

PL/SQL Curseur
Un curseur permet de balayer les lignes d'une table
DECLARE CURSOR <cursorname> IS SELECT . . . ; BEGIN OPEN <cursorname>;

LOOP FETCH <cursorname> INTO var1, var2, . . .; EXIT WHEN <cursorname>%NOTFOUND; <traitement> END LOOP; CLOSE <cursorname> END;
7

PL/SQL boucle FOR pour curseur


DECLARE CURSOR <cursorname> IS SELECT . . . ; <rowname> %ROWTYPE; BEGIN FOR <rowname> IN <cursorname> LOOP . . . <rowname>.<attributename> . . . END LOOP; END;

PL/SQL structure de contrle


Contrle conditionnel
IF <condition> THEN <instruction ou bloc> END IF; IF <condition> THEN <instruction ou bloc> ELSE <instruction ou bloc> END IF;

PL/SQL structure de contrle


Contrle itratif
FOR i IN 1..n LOOP <traitement> END LOOP;

10

PL/SQL structure de contrle


Contrle itratif
WHILE <condition> LOOP <traitement> END LOOP; LOOP <traitement> EXIT WHEN <condition>; END LOOP;

11

Contrainte ensembliste clause CREATE TRIGGER


CREATE TABLE Livre ( DROP TRIGGER moyenne_prix; noLivre NUMERIC PRIMARY KEY, CREATE TRIGGER moyenne_prix prix NUMERIC(9,2) BEFORE INSERT OF Prix ) ON Livre FOR EACH ROW CREATE TABLE PrixLivre ( DECLARE nb NUMERIC, prix_moyen number; somme NUMERIC(12,2) BEGIN ) SELECT SOMME/NB INTO prix_moyen FROM PrixLivre; INSERT INTO PrixLivre VALUES (1,0); IF (prix_moyen>0) THEN IF (:new.PRIX < prix_moyen*0.7 OR :new.PRIX > prix_moyen*1.3) THEN raise_application_error(-20001,'Prix modifiant trop la moyenne!'); END IF; IF (:new.PRIX > prix_moyen*0.7 AND :new.PRIX < prix_moyen*1.3) THEN UPDATE PrixLivre SET NB=NB+1, SOMME=SOMME+:new.PRIX; END IF; ELSE UPDATE PrixLivre SET SOMME=SOMME+:new.PRIX; END IF; END; . RUN

12

Syntaxe Gnrale des Dclencheurs


CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF COLUMN [,COLUMN] ]} [OR {DELETE | INSERT | UPDATE [OF COLUMN [,COLUMN] ]} ] ... ON <table_name> [FOR EACH ROW] <BLOCK PL-SQL>

Il existe d'autres options, voir la documentation Oracle.

13

Suppression d'un dclencheur clause DROP TRIGGER


supprime un dclencheur existant. Exemple :
DROP TRIGGER prix_croissant;

14

Dsactivation d'un dclencheur clause ALTER TRIGGER DISABLE


Dsactive temporairement un dclencheur existant. Exemple :
ALTER TRIGGER prix_croissant DISABLE;

15

Activation d'un dclencheur clause ALTER TRIGGER ENABLE


Active un dclencheur existant. Exemple :
ALTER TRIGGER prix_croissant ENABLE;

16

Dfinition de contraintes CREATE TRIGGER (SQLServer)

17

Tables temporaires deleted / inserted


Lors d'une insertion, suppression ou modification SQLServer utilise les tables temporaires deleted et inserted. Suite une insertion <table> = <table> Union inserted Suite une suppression <table> = <table> Minus deleted Suite une modification <table> = <table> Minus deleted Union inserted
18

Contrainte temporelle clause CREATE TRIGGER


spcifie comment doivent voluer les donnes lors d'une mise jour CREATE TABLE JOB ( CREATE TRIGGER trigsal
ON job ) FOR UPDATE AS DECLARE @old NUMERIC, @new NUMERIC Remarque: le dclencheur ne SELECT @old = d.sal fonctionne que si une seule FROM deleted d ligne est mise jour SELECT @new = i.sal FROM inserted i IF @old > @new RAISERROR('le salaire ne peut pas baisser',16,1)
19

no NUMERIC, sal NUMERIC

Transact-SQL (T_SQL) structure de bloc


Pour regrouper un ensemble d'instructions
BEGIN . . . END

20

T-SQL Variables et constantes


Dclaration
DECLARE @<varname> <type>, @<varname> <type>

Assignation des variables


SET @<varname> = <value> SET @<varname> = <expression>

21

T-SQL Curseur
Un curseur permet de balayer les lignes d'une table
DECLARE <cursorname> CURSOR FOR SELECT . . . OPEN <cursorname>

FETCH NEXT FROM <cursorname> INTO @var1, @var2, . . .


WHILE @@FETCH_STATUS = 0 BEGIN <TRAITEMENT> FETCH NEXT FROM <cursorname> INTO @var1, @var2, . . . END CLOSE <cursorname> DEALLOCATE <cursorname>

22

T-SQL structure de contrle


Contrle conditionnel
IF <condition> <instruction ou bloc>

IF <condition> <instruction ou bloc> ELSE <instruction ou bloc>

23

T-SQL structure de contrle


Contrle itratif
WHILE <condition> <instruction ou bloc>

WHILE <condition> BEGIN <traitement> IF <condition> BREAK <traitement> END


24

CREATE TRIGGER tsal ON job FOR UPDATE AS DECLARE @no NUMERIC, @old NUMERIC, @new NUMERIC DECLARE cursOld CURSOR FOR SELECT d.no, d.sal FROM deleted d OPEN cursOld FETCH NEXT FROM cursOld INTO @no, @old WHILE @@FETCH_STATUS = 0 BEGIN SELECT @new = i.sal FROM inserted i WHERE i.no=@no IF @old > @new BEGIN PRINT 'no'+CONVERT(VARCHAR,@no)+'old:'+CONVERT(VARCHAR,@old)+'new:'+CONVERT(VARCHAR,@new) RAISERROR ('le salaire ne peut pas baisser',16,1) ROLLBACK END FETCH NEXT FROM cursOld INTO @no, @old END CLOSE cursOld DEALLOCATE cursOld

Curseur Exemple

25

Contrainte ensembliste clause CREATE TRIGGER


CREATE TRIGGER moy_prix ON Livre FOR UPDATE, INSERT AS DECLARE @n NUMERIC
CREATE TABLE Livre ( noLivre NUMERIC PRIMARY KEY, prix NUMERIC(9,2) )

SELECT @n = COUNT(*) FROM inserted WHERE prix>1.3*(SELECT AVG(prix) FROM Livre) OR prix<0.7*(SELECT AVG(prix) FROM Livre) IF @n > 0 BEGIN RAISERROR ('Trop grande modification de la moyenne',16,1) ROLLBACK END

26

Suppression d'un dclencheur clause DROP TRIGGER


supprime un dclencheur existant. Exemple :
DROP TRIGGER prix_croissant;

27

Exercices

28

Exercice Insertion dans une autre table


Crer le dclencheur qui insrera automatiquement une ligne dans la table A_commander lorsque la quantit en stock tombe en dessous de la quantit minimum
CREATE TABLE Produit ( noProduit NUMERIC PRIMARY KEY, qte_en_stock NUMERIC, qte_minimum NUMERIC, qte_a_commander NUMERIC ) CREATE TABLE A_Commander ( noProduit NUMERIC, qte NUMERIC )

29

Exercice Calcul d'attribut


Crer un dclencheur qui lors d'un ajout ou dune modification d'une ligne de commande met jour automatiquement le montant de la commande et la quantit en stock du produit correspondant.
CREATE TABLE Commande ( noCommande NUMERIC PRIMARY KEY, dateComm DATE, montantCommande NUMERIC(10,2) ); CREATE TABLE LigneCommande ( noCommande NUMERIC NOT NULL REFERENCES Commande(noCommande), noProduit NUMERIC NOT NULL REFERENCES Produit(noProduit), qte NUMERIC, prix_unitaire NUMERIC(10,2), CONSTRAINT pk_LigneCommande PRIMARY KEY(noCommande, noProduit) )

30