cm6 : pl/pgsql et triggers mickaël martin-nevot

9
Mickaël Martin-Nevot 05/10/2018 11:12 Cette œuvre de Mickaël Martin Nevot est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage à l'Identique 3.0 non transposé . Cette œuvre est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage à l'Identique 3.0 non transposé . V1.0.0 CM6 : PL/pgSQL et triggers

Upload: others

Post on 15-Jun-2022

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Mickaël Martin-Nevot

05/10/2018 11:12

Cette œuvre de Mickaël Martin Nevot est mise à disposition selon les termes de la

licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage à l'Identique

3.0 non transposé.

Cette œuvre est mise à disposition selon les termes de la

licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage à l'Identique

3.0 non transposé.

V1.0.0

CM6 : PL/pgSQL et triggers

Page 2: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

I. Prés.

II. BD et SGBD

III. Merise

IV. LDD

V. LMD

VI. LCT

VII. Droits

VIII. LDSP

IX. SQL avancé

X. PL/pgSQL

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 1/8

Page 3: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

Procedural language/PostgreSQL structured query

language : langage procédural de PostgreSQL

Pourquoi PL/pgSQL (limites de SQL) ?

Combinaison de requêtes avec mécanismes procéduraux

(variables, structures de contrôle, etc.)

Ajout de fonctions utilisateur

Triggers

Procédures stockées (hors cadre du cours)

PL/pgSQL

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 2/8

SQL n’est pas procédural

Page 4: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

Déclencheur (procédure déclenchée, « gâchette »)

Définition de contraintes d’intégrité sémantique

Spécifie les actions à réaliser lors (avant ou après)

d’écritures (INSERT, UPDATE, DELETE, etc.)

Associé à une seule relation

Exécution automatique

Trigger de ligne ou de table

Utilise une fonction (PL/pgSQL) trigger

Trigger

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 3/8

Lorsqu'on supprime une relation, tous les triggers associés sont aussi supprimés

Il faut définir la fonction trigger avant le trigger

Si écriture est effective

(même avec aucun tuple concerné)

Page 5: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

CREATE FUNCTION : Création d’une fonction trigger

Variables spéciales (transitoires) :

NEW : tuple créé/modifié (uniquement INSERT, UPDATE)

OLD : tuple affecté (uniquement UPDATE, DELETE)

Etc.

Trigger

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 4/8

Syntaxe :CREATE FUNCTION function_name() RETURNS trigger AS $$ BEGIN

[IF condition[THEN RAISE EXCEPTION '...';]

END IF;][...]RETURN NEW;

END; $$ LANGUAGE plpgsql;Type de retour : $$ permet de délimiter une

définition de fonction (sans cela, chaque ; est

considéré comme une fin de requête SQL)

Uniquement trigger de ligne

Page 6: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

CREATE TRIGGER : création d’un trigger

BEFORE, AFTER : fonction appelée avant ou après l'événement

FOR EACH ROW, FOR EACH STATEMENT : déclenché pour

chaque tuple (trigger de ligne) ou une seule fois par demande

d’écriture SQL (trigger de table)

WHEN : condition de déclenchement

DROP TRIGGER : suppression d’un trigger

Trigger

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 5/8

Syntaxe :CREATE [...] TRIGGER name {BEFORE|AFTER|...} {<EVENT> [OR ...]}ON Tbl [...] [FOR [EACH] {ROW|STATEMENT}] [WHEN (condition)]EXECUTE PROCEDURE function_name (arguments)

<EVENT> : INSERT, UPDATE, DELETE ou TRUNCATE

Syntaxe :DROP TRIGGER [IF EXISTS] name ON Tbl [...]

Page 7: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

CREATE OR REPLACE FUNCTION garde_fou() RETURNS Trigger AS $$

BEGIN

IF (SELECT COUNT(*) FROM Convention WHERE Convention.idp = NEW.idp) > 2

THEN RAISE EXCEPTION 'Employe trop occupe';

END IF;

RETURN NEW;

END; $$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS Garde_Fou ON Convention;

CREATE TRIGGER Garde_Fou

AFTER INSERT ON Convention

FOR EACH ROW

EXECUTE PROCEDURE garde_fou();

-- Provoque une erreur.

INSERT INTO Convention VALUES (8, 13, 12, '2020-4-12', '2020-7-01', 5, '...', 11);

Exemple de trigger

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 6/8

Page 8: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

Procédures stockées

Curseurs

Gestion des erreurs

Aller plus loin

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 7/8

Page 9: CM6 : PL/pgSQL et triggers Mickaël Martin-Nevot

Prés. > BD et SGBD > Merise > LDD > LMD > LCT > Droits > LDSP > SQL avancé > PL/pgSQL V1.0.0

Auteur

Mickaël Martin Nevot

[email protected]

Carte de visite électronique

Cours en ligne sur : www.mickael-martin-nevot.com

Mickaël Martin-Nevot

[email protected]

Carte de visite électronique

Relecteurs

Laurent Carmignac

Crédits

Utilisation des bases de données Mickaël Martin-Nevot - Laurent Carmigniac 8/8