Oracle Déclencheur PL/SQL : au lieu de types composés

⚡ Résumé intelligent

Les déclencheurs PL/SQL sont des programmes stockés que les Oracle Le moteur se déclenche automatiquement lors d'une opération DML, DDL ou d'un événement de base de données. Il garantit l'intégrité des données, applique les règles et prend en charge l'audit ; il inclut les types AVANT, APRÈS, AU LIEU DE et les types composés.

  • (I.e. Définition du déclencheur : Un déclencheur est un programme stocké. Oracle Le moteur se déclenche automatiquement lors d'un événement DML, DDL ou de base de données spécifié.
  • (I.e. Types de déclencheur : Les déclencheurs sont classés selon le moment (AVANT, APRÈS, AU LIEU DE), le niveau (INSTRUCTION, LIGNE) et l'événement (DML, DDL, BASE DE DONNÉES).
  • (I.e. :NOUVEAU et :ANCIEN: Les déclencheurs au niveau des lignes utilisent les clauses :NEW et :OLD pour lire les valeurs des colonnes avant et après l'instruction DML.
  • 🪟 AU LIEU DE Déclencheur : Un déclencheur INSTEAD OF permet de rendre modifiable une vue complexe autrement non modifiable en agissant sur ses tables de base.
  • 🧩 Déclencheur composé : Un déclencheur composé combine les actions des quatre points de synchronisation à l'intérieur d'un seul corps de déclencheur.
  • 🤖 Assistance IA : Les assistants IA tels que GitHub Copilot rédigent AVANT, APRÈS, AU LIEU DE et combinent des déclencheurs à partir d'un commentaire.

Oracle Déclencheurs PL/SQL, y compris INSTEAD OF et les types de déclencheurs composés

Qu’est-ce que Trigger en PL/SQL ?

Les déclencheurs sont stockés PL / SQL programmes qui sont déclenchés par le Oracle moteur automatiquement lorsque Instructions DML Les opérations d'insertion, de mise à jour et de suppression sont exécutées sur la table, ou lors de la survenue de certains événements. Le code à exécuter dans le cas d'un déclencheur peut être défini selon les besoins. Vous pouvez choisir l'événement qui déclenche le déclencheur et le moment de son exécution. L'objectif d'un déclencheur est de garantir l'intégrité des informations dans la base de données.

Avantages des déclencheurs

Voici les avantages des déclencheurs.

  • Génération automatique de certaines valeurs de colonnes dérivées
  • Application de l'intégrité référentielle
  • Journalisation des événements et stockage des informations sur l'accès aux tables
  • vérification des comptes
  • Syncréplication horaire des tables
  • Imposer des autorisations de sécurité
  • Empêcher les transactions invalides

Types de déclencheurs dans Oracle

Les déclencheurs peuvent être classés en fonction des paramètres suivants.

Classification basée sur le moment

  • AVANT Déclenchement : Il se déclenche avant que l'événement spécifié ne se produise.
  • APRÈS Déclencheur : Il se déclenche après la survenue de l'événement spécifié.
  • AU LIEU DE Déclencheur : Un type particulier. Vous en apprendrez davantage dans les sections suivantes. (Réservé aux utilisateurs de DML)

Classification basée sur le niveau

  • Déclencheur de niveau ÉTAPE : Elle se déclenche une seule fois pour l'instruction d'événement spécifiée.
  • Déclencheur au niveau de la LIGNE : Elle se déclenche pour chaque enregistrement affecté par l'événement spécifié. (uniquement pour les opérations DML)

Classification basée sur l'événement

  • Déclencheur DML : Il se déclenche lorsque l'événement DML est spécifié (INSERT/UPDATE/DELETE).
  • Déclencheur DDL : Il se déclenche lorsque l'événement DDL est spécifié (CREATE/ALTER).
  • Déclencheur de base de données : Il se déclenche lorsque l'événement de base de données est spécifié (CONNEXION/DÉCOUVERTE/DÉMARRAGE/ARRÊT).

Chaque déclencheur est donc une combinaison des paramètres ci-dessus.

Comment créer un déclencheur

Vous trouverez ci-dessous la syntaxe pour créer un déclencheur. La capture d'écran ci-dessous illustre cette syntaxe. Oracle.

Syntaxe de création de déclencheurs avec les options AVANT, APRÈS et AU LIEU DE dans Oracle PL / SQL

CREATE [ OR REPLACE ] TRIGGER <trigger_name> 

[BEFORE | AFTER | INSTEAD OF ]

[INSERT | UPDATE | DELETE......]

ON<name of underlying object>

[FOR EACH ROW] 

[WHEN<condition for trigger to get execute> ]

DECLARE
<Declaration part>
BEGIN
<Execution part> 
EXCEPTION
<Exception handling part> 
END;

Explication de la syntaxe :

  • La syntaxe ci-dessus montre les différentes instructions facultatives présentes lors de la création du déclencheur.
  • AVANT/APRÈS précisera le moment de l'événement.
  • INSÉRER/MISE À JOUR/CONNEXION/CRÉER/etc. spécifiera l'événement pour lequel le déclencheur doit être déclenché.
  • La clause ON spécifie l'objet sur lequel l'événement mentionné ci-dessus est valide. Par exemple, il s'agit du nom de la table sur laquelle l'événement DML peut se produire dans le cas d'un déclencheur DML.
  • La commande « POUR CHAQUE LIGNE » spécifiera le déclencheur au niveau de la LIGNE.
  • La clause WHEN précisera la condition supplémentaire dans laquelle le déclencheur doit s'activer.
  • La partie déclaration, la partie exécution et la partie gestion des exceptions sont identiques à celles des autres Blocs PL/SQLLa partie déclaration et la gestion des exceptions Certaines parties sont facultatives.

Clauses :NOUVEAU et :ANCIENNE

Dans un déclencheur au niveau de la ligne, le déclencheur se déclenche pour chaque ligne associée. Et parfois, il est nécessaire de connaître la valeur avant et après l'instruction DML.

Oracle Le déclencheur au niveau de la ligne comporte deux clauses permettant de stocker ces valeurs. Ces clauses permettent de faire référence aux anciennes et nouvelles valeurs dans le corps du déclencheur.

  • :NOUVEAU – Elle contient une nouvelle valeur pour les colonnes de la table/vue de base lors de l'exécution du déclencheur.
  • :VIEUX – Elle conserve l'ancienne valeur des colonnes de la table/vue de base pendant l'exécution du déclencheur.

Cette clause doit être utilisée en fonction de l'événement DML. Le tableau ci-dessous indique quelle clause est valide pour quelle instruction DML (INSERT/UPDATE/DELETE).

INSERT MISE A JOUR EFFACER
:NOUVEAU VALIDE VALIDE INVALIDE. Aucune nouvelle valeur n'a été trouvée dans le cas de la suppression.
:VIEUX INVALIDE. Aucune valeur antérieure n'a été trouvée dans ce cas d'insertion. VALIDE VALIDE

AU LIEU DE Déclencheur

Un déclencheur « INSTEAD OF » est un type particulier de déclencheur. Il est utilisé uniquement dans les déclencheurs DML. Il est utilisé lorsqu'un événement DML est sur le point de se produire sur une vue complexe.

Prenons l'exemple d'une vue construite à partir de trois tables de base. Toute opération DML effectuée sur cette vue sera invalide car les données proviennent de trois tables différentes. Dans ce cas, un déclencheur INSTEAD OF est utilisé. Ce déclencheur permet de modifier directement les tables de base au lieu de modifier la vue pour l'événement donné.

Exemple 1: Dans cet exemple, nous allons créer une vue complexe à partir de deux tables de base, où Table_1 est la table des employés et Table_2 est la table des départements.

Nous allons ensuite voir comment le déclencheur INSTEAD OF est utilisé pour mettre à jour les détails de localisation dans cette vue complexe. Nous verrons également l'utilité des attributs :NEW et :OLD dans les déclencheurs. L'exemple se déroule en plusieurs étapes :

  • Étape 1 : Création des tables « emp » et « dept » avec les colonnes appropriées
  • Étape 2 : Remplissage des tableaux avec des valeurs d’exemple
  • Étape 3 : Création d’une vue pour les tables créées ci-dessus
  • Étape 4 : Mise à jour de la vue avant le déclencheur INSTEAD OF
  • Étape 5 : Création du déclencheur INSTEAD OF
  • Étape 6 : Mise à jour de la vue après le déclencheur INSTEAD OF

Étape 1) Création des tables 'emp' et 'dept' avec les colonnes appropriées.

La capture d'écran ci-dessous montre la création des tables de base « emp » et « dept » dans Oracle.

Création des tables de base emp et dept dans Oracle pour l'exemple de déclencheur INSTEAD OF

CREATE TABLE emp(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager VARCHAR2(50),
dept_no NUMBER);
/

CREATE TABLE dept(
Dept_no NUMBER,
Dept_name VARCHAR2(50),
LOCATION VARCHAR2(50));
/

Code Explication

  • Code lignes 1-7 : Création de la table 'emp'.
  • Code lignes 8-12 : Création de la table « département ».

Sortie :

Table Created

Étape 2) Maintenant que nous avons créé les tableaux, nous allons les remplir avec des exemples de valeurs.

La capture d'écran ci-dessous montre les lignes d'exemple insérées dans les tables « dept » et « emp ».

Insertion d'exemples de lignes de département et d'employé dans Oracle PL / SQL

BEGIN
INSERT INTO DEPT VALUES(10,'HR','USA');
INSERT INTO DEPT VALUES(20,'SALES','UK');
INSERT INTO DEPT VALUES(30,'FINANCIAL','JAPAN');
COMMIT;
END;
/

BEGIN
INSERT INTO EMP VALUES(1000,'XXX',15000,'AAA',30);
INSERT INTO EMP VALUES(1001,'YYY',18000,'AAA',20) ;
INSERT INTO EMP VALUES(1002,'ZZZ',20000,'AAA',10);
COMMIT;
END;
/

Code Explication

  • Code lignes 13-19 : Insertion des données dans la table « département ».
  • Code lignes 20-26 : Insertion des données dans la table 'emp'.

Sortie :

PL/SQL procedure completed

Étape 3) Création d'une vue pour les tables créées ci-dessus.

La capture d'écran ci-dessous montre la création puis l'interrogation de la vue complexe.

Création et interrogation de la vue complexe guru99_emp_view joignant emp et dept

CREATE VIEW guru99_emp_view(
Employee_name,dept_name,location) AS
SELECT emp.emp_name,dept.dept_name,dept.location
FROM emp,dept
WHERE emp.dept_no=dept.dept_no;
/
SELECT * FROM guru99_emp_view;

Code Explication

  • Code lignes 27-32 : Création de la vue 'guru99_emp_view'.
  • Code ligne 33: Interrogation de guru99_emp_view.

Sortie :

View created
NOM DE L'EMPLOYÉ DEPT_NAME EMPLACEMENT
ZZZ HR États-Unis
YYY Vente UK
XXX FINANCIERE JAPON

Étape 4) Mise à jour de la vue avant le déclencheur INSTEAD OF.

La capture d'écran ci-dessous illustre la tentative de mise à jour de la vue complexe et l'erreur qui en résulte.

Mise à jour concernant l'échec de la vue complexe avec l'erreur ORA-01779 avant le déclencheur INSTEAD OF

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/

Code Explication

  • Code lignes 34-38 : Mettez à jour l'emplacement de « XXX » à « FRANCE ». Une exception a été levée car les instructions DML ne sont pas autorisées directement sur la vue complexe.

Sortie :

ORA-01779: cannot modify a column which maps to a non key-preserved table

ORA-06512: at line 2

Étape 5) Pour éviter l'erreur rencontrée lors de la mise à jour de la vue à l'étape précédente, nous allons utiliser un déclencheur « INSTEAD OF » dans cette étape.

La capture d'écran ci-dessous montre la création du déclencheur INSTEAD OF.

Création du déclencheur guru99_view_modify_trg INSTEAD OF sur la vue complexe

CREATE TRIGGER guru99_view_modify_trg
INSTEAD OF UPDATE
ON guru99_emp_view
FOR EACH ROW
BEGIN
UPDATE dept
SET location=:new.location
WHERE dept_name=:old.dept_name;
END;
/

Code Explication

  • Code ligne 39: Création du déclencheur INSTEAD OF pour l'événement « UPDATE » de la vue « guru99_emp_view » au niveau de la ligne. Il contient l'instruction de mise à jour permettant de modifier l'emplacement dans la table de base « dept ».
  • Code ligne 44: L'instruction UPDATE utilise ':NEW' et ':OLD' pour trouver la valeur des colonnes avant et après la mise à jour.

Sortie :

Trigger Created

Étape 6) Mise à jour de la vue après le déclenchement INSTEAD OF. L'erreur ne s'affichera plus, car le déclencheur INSTEAD OF gérera la mise à jour de cette vue complexe. Lors de l'exécution du code, la localisation de l'employé XXX passera de « Japon » à « France ».

La capture d'écran ci-dessous illustre la mise à jour réussie via le déclencheur INSTEAD OF et la vue actualisée.

Mise à jour réussie de l'affichage via le déclencheur INSTEAD OF montrant l'emplacement FRANCE

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/
SELECT * FROM guru99_emp_view;

Code Explication:

  • Code lignes 49-53 : Mise à jour de l'emplacement de « XXX » vers « FRANCE ». Cette opération a réussi car le déclencheur « INSTEAD OF » a interrompu l'instruction de mise à jour de la vue et a effectué la mise à jour de la table de base.
  • Code ligne 55: Vérification de l'enregistrement mis à jour.

Sortie :

PL/SQL procedure successfully completed
NOM DE L'EMPLOYÉ DEPT_NAME EMPLACEMENT
ZZZ HR États-Unis
YYY Vente UK
XXX FINANCIERE FRANCE

Déclencheur composé

Le déclencheur composé est un déclencheur qui permet de définir des actions pour chacun des quatre points de temporisation dans un seul corps de déclencheur. Les quatre points de temporisation différents qu'il prend en charge sont indiqués ci-dessous.

  • AVANT DÉCLARATION – niveau
  • AVANT LA RANGÉE – niveau
  • APRÈS LA LIGNE – niveau
  • APRÈS DÉCLARATION – niveau

Il offre la possibilité de combiner les actions pour différents timings en un seul déclencheur.

La capture d'écran ci-dessous illustre la syntaxe du déclencheur composé avec ses quatre sections de temporisation.

Syntaxe d'un déclencheur composé montrant les sections d'instruction BEFORE et AFTER et de synchronisation des lignes

CREATE [ OR REPLACE ] TRIGGER <trigger_name>
FOR
[INSERT | UPDATE | DELETE.......]
ON <name of underlying object>
<Declarative part>
BEFORE STATEMENT IS
BEGIN
<Execution part>;
END BEFORE STATEMENT;

BEFORE EACH ROW IS
BEGIN
<Execution part>;
END EACH ROW;

AFTER EACH ROW IS
BEGIN
<Execution part>;
END AFTER EACH ROW;

AFTER STATEMENT IS
BEGIN
<Execution part>;
END AFTER STATEMENT;
END;

Explication de la syntaxe :

  • La syntaxe ci-dessus illustre la création d'un déclencheur « COMPOUND ».
  • La section déclarative est commune à tous les blocs d'exécution du corps du déclencheur.
  • Ces quatre blocs de temporisation peuvent être disposés dans n'importe quel ordre. Il n'est pas obligatoire de les utiliser tous les quatre. On peut créer un déclencheur COMPOSÉ uniquement pour les temporisations nécessaires.

Exemple 1: Dans cet exemple, nous allons créer un déclencheur pour remplir automatiquement la colonne salaire avec la valeur par défaut 5000.

La capture d'écran ci-dessous montre un exemple de déclencheur composé et son résultat.

Déclencheur composé remplissant automatiquement la colonne salaire avec une valeur par défaut de 5000

CREATE TRIGGER emp_trig
FOR INSERT
ON emp
COMPOUND TRIGGER
BEFORE EACH ROW IS
BEGIN
:new.salary:=5000;
END BEFORE EACH ROW;
END emp_trig;
/
BEGIN
INSERT INTO EMP VALUES(1004,'CCC',15000,'AAA',30);
COMMIT;
END;
/
SELECT * FROM emp WHERE emp_no=1004;

Code Explication:

  • Code lignes 2-10 : Création du déclencheur composé. Il est créé pour le niveau de temporisation AVANT LIGNE afin de renseigner le salaire avec la valeur par défaut 5000. Cela modifiera le salaire à la valeur par défaut « 5000 » avant l'insertion de l'enregistrement dans la table.
  • Code lignes 11-14 : Insérer l'enregistrement dans la table 'emp'.
  • Code ligne 16: Vérification de l'enregistrement inséré.

Sortie :

Trigger created

PL/SQL procedure successfully completed.
EMP_NAME EMP_NON LE SALAIRE DE VENTE DEPT_NON
CCC 1004 5000 AAA 30

Activation et désactivation des déclencheurs

Les déclencheurs peuvent être activés ou désactivés. Pour ce faire, une instruction ALTER (DDL) doit être fournie pour le déclencheur concerné.

Vous trouverez ci-dessous la syntaxe permettant d'activer/désactiver les déclencheurs.

ALTER TRIGGER <trigger_name> [ENABLE|DISABLE];
ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;

Explication de la syntaxe :

  • La première syntaxe montre comment activer/désactiver un déclencheur unique.
  • La deuxième instruction montre comment activer/désactiver tous les déclencheurs sur une table particulière.

FAQ

L'erreur ORA-04091 (modification de table) se produit lorsqu'un déclencheur au niveau des lignes tente d'interroger ou de modifier la table qui l'a déclenché. Pour l'éviter, utilisez un déclencheur composé, un déclencheur au niveau de l'instruction ou stockez les lignes dans une collection de packages.

Un déclencheur s'active automatiquement lorsqu'une opération DML, DDL ou un événement de base de données se produit, ne prend aucun paramètre et ne renvoie rien. procédure stockée Elle ne s'exécute que lorsqu'on l'appelle explicitement, accepte des paramètres et peut renvoyer des valeurs.

Utilisez l'instruction DROP TRIGGER nom_du_déclencheur pour supprimer définitivement un déclencheur. Contrairement à la désactivation, qui conserve le déclencheur mais empêche son exécution, la suppression (DROP TRIGGER) permet de supprimer définitivement un déclencheur.ping Cette fonction supprime entièrement la définition ; vous devez donc la recréer si la logique est à nouveau nécessaire.

Consultez les vues du dictionnaire de données USER_TRIGGERS pour vos propres déclencheurs ou ALL_TRIGGERS pour tous les déclencheurs accessibles. Elles affichent le nom, le type, l'événement déclencheur, l'objet de base et l'état du déclencheur, ce qui facilite l'audit des déclencheurs existants.

Pas directement, car le déclencheur partage les mêmes caractéristiques que l'instruction de tir. transactionPour valider indépendamment, déclarez le déclencheur, ou une procédure qu'il appelle, avec PRAGMA AUTONOMOUS_TRANSACTION, qui exécute le travail dans une transaction séparée qui valide de manière autonome.

Avant Oracle Dans la version 11g, l'ordre d'exécution des déclencheurs de même type n'était pas garanti. À partir de la version 11g, la clause FOLLOWS de l'instruction CREATE TRIGGER permet de spécifier qu'un déclencheur s'exécute après l'autre, assurant ainsi un ordre d'exécution déterministe.

Oui. Copilote GitHub brouillons AVANT, APRÈS, AU LIEU DE et déclencheurs composés, y compris les références :NOUVEAU et :ANCIEN, à partir d'un commentaire. RevExaminez le calendrier, la condition WHEN et les risques liés à la table de mutation avant de déployer le déclencheur généré.

Des assistants IA analysent les déclencheurs afin de détecter les risques liés aux tables de mutation, l'absence de gestion des variables `:NEW` ou `:OLD`, les déclenchements récursifs et les logiques complexes qui ralentissent les opérations DML. Cette analyse par apprentissage automatique signale les déclencheurs fragiles et suggère des réécritures au niveau des instructions ou des composés avant la mise en production du code.

Résumez cet article avec :