Leçons du module (3/4)
Introduction aux déclencheurs (triggers)
Un déclencheur est une boîte magique (un capteur) qui exécute automatiquement un élément de logique AVANT ou APRÈS un événement d'insertion, de mise à jour ou de suppression dans les données.\nAvant d'apprendre à une table à réagir, nous devons cependant lui donner une "Fonction de déclenchement" spéciale écrite en PL/pgSQL qui doit se terminer par renvoyer un format synthétique appelé "TRIGGER".
Ces fonctions n'acceptent pas les arguments normaux entre parenthèses ; à la place, ils proposent gratuitement les objets magiques intégrés NEW et OLD, qui contiennent les données de ligne originales ou entrantes de la table que le capteur surveille !
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;Cette procédure effectue le dur travail d’écriture dans le journal. Plus tard, dans un second temps, il sera connecté en permanence aux événements de la table que l'on souhaite protéger.
Essayez-le vous-même
Nous devons protéger les clients : personne de moins de 18 ans (notre chèque virtuel) ou, au-delà d'une logique fictive, nous voulons forcer la chaîne 'prénom' passée au moment de l'INSERT à toujours être stockée en majuscule dans la base de données, en ignorant tout formatage client JS. Écrivez une fonction de déclenchement appelée 'force_uppercase_name()'. Il n'accepte aucun argument (). Il renvoie TRIGGER. Créez le modèle de corps. Forcez l'attribution de l'intégralité de l'objet entrant via l'affectation magique 'NEW.first_name = UPPER(NEW.first_name);'. Puis RENVOYEZ la NOUVELLE variable remodelée.
Afficher l'indice
CRÉER OU REMPLACER UNE FONCTION force_uppercase_name() RETOURNE LE DÉCLENCHEUR AS $$ BEGIN NEW.first_name = UPPER(NEW.first_name); RETOURNER NOUVEAU ; FIN; $$ LANGUE plpgsql;
Solution disponible après 3 tentatives
Créez une fonction de déclenchement 'protect_price_drops()' qui bloque les mises à jour malveillantes lorsqu'un attaquant est sur le point d'économiser un prix ridiculement bas sur un produit. Utilisez une logique telle que 'IF NEW.unit_price < OLD.unit_price THEN', déclenchant une exception native qui fait tout planter. Une exception PL/pgSQL fatale utilise la forme 'RAISE EXCEPTION ''Prezzo non abbassabile!'';'.
Afficher l'indice
COMMENCER SI NEW.unit_price < OLD.unit_price THEN RAISE EXCEPTION 'Prezzo non abbassabile!'; FIN SI ; RETOURNER NOUVEAU ; FIN;
Solution disponible après 3 tentatives