La syntaxe des déclencheurs sous Oracle peut être plus ou moins complexe.

CREATE [ OR REPLACE ] TRIGGER propriétaire.nom_déclencheur
AFTER | BEFORE { [ INSERT [ OR DELETE 
          [ OR UPDATE OF nom_colonne,...,nom_colonneN ] ] ] }
ON propriétaire.nom_table
FOR EACH ROW nom_procédure (argument...argumentN);

La seconde syntaxe se révèle bien plus abconse, puisqu'elle intègre non seulement les déclencheurs DML mais également d'autres types de déclencheurs basés sur des commandes DDL ou DATABASE.

En outre, pour les déclencheurs DML, des clauses spécifiques aux vues apparaissent, ainsi que la clause REFERENCING.

CREATE [ OR REPLACE ] TRIGGER [ schéma. ] nom_déclencheur
{
  AFTER | BEFORE | INSTEAD OF
}
{
  {
  [ INSERT
  [ OR DELETE
  [ OR UPDATE [ OF nom_colonne [, nom_colonneN ] ] ] ] ]
  }
  ON
  {
   { [ schéma. ] nom_table }
       |
   { [ NESTED TABLE colonne_emboîtée OF ] [ schéma . ] nom_vue }
  }
  {
   [ REFERENCING ] 
   {
        [ OLD [ AS ] ancienne_colonne 
        | NEW [ AS ] nouvelle_colonne 
        | PARENT [ AS ] colonne_parente ]
   }
  }
  [ FOR EACH ROW ] instruction_SQL;
}
  |
{
  {
  { Evénement_DDL [ OR EvénementN_DDL ] }
      |
  { Evénement_Base_Données [ OR EvénementN_Base_Données ]
  }
  ON
  {
  { [ schéma. ] SCHEMA } | DATABASE
  }
  WHEN ( Condition )
   { instruction_PL/SQL | instruction_procédure };
}

La commande OR REPLACE recrée le déclencheur s'il existe déjà.

La clause BEFORE indique que le déclencheur doit être lancé avant l'exécution de l'événement.

La clause AFTER indique que le déclencheur doit être lancé après l'exécution de l'événement.

Les instructions INSERT et DELETE indique au déclencheur de s'exécuter lors respectivement d'une insertion ou d'une suppression dans la table.

La clause UPDATE OF indique que le déclencheur doit être lancé lors de chaque mise à jour d'une des colonnes spécifiées. Si elle est omise, n'importe quelle colonne de la table modifiée provoque le décle,chement du Trigger.

La clause ON désigne le nom de la table associé à son schéma pour lequel le déclencheur a été spécifiquement créé.

La clause FOR EACH ROW désigne le déclencheur pour être un déclencheur de ligne. Oracle lance un déclencheur de ligne une fois pour chaque ligne qui est affectée par l'instruction de déclenchment. Si la clause est omise, le déclencheur est un déclencheur d'instruction. Oracle lance un déclencheur de d'instructionune fois seulement lorsque l'instruction déclenchante est émise si la contrainte du déclencheur optionnelle est rencontrée.

La clause REFERENCING permet de spécifier des noms de corrélation. Il est possible d'utiliser les noms de corrélation dans des blocs d'instructions PL/SQL et dans la condition WHEN d'une déclencheur de ligne pour se référer spécifiquement à des valeurs anciennes et nouvelles de la ligne courante. Les noms de corrélation par défaut sont OLD et NEW. Si le déclencheur de ligne est associé à une table nommée OLD ou NEW, l'utilisation de cette clause permet de spécifier des noms de corrélations différents afin d'éviter une confusion entre les noms de table et les noms de corrélation.
Si le déclencheur est défini sur une table imbriquée, OLD et NEW se référent à la ligne de la table imbriquée, et PARENT se référe à la ligne courante de la table parente.
Si le déclencheur est défini sur une table ou une vue, OLD et NEW se référe aux instances d'objet.
La clause REFERENCING n'est pas valide avec les déclencheurs INSTEAD OF sur les événements DDL de création.

Pour de plus amples renseignements consulter la documentation d'Oracle.

Exemple
-- Premier exemple 
CREATE OR REPLACE TRIGGER declencheur_suppression
  AFTER DELETE ON tbl_1
  FOR EACH ROW
  WHEN (1 = 1)
  DECLARE action_utilisateur VARCHAR2(50);
  BEGIN
  SELECT user INTO action_utilisateur
  FROM DUAL;
  INSERT INTO delete_log
  VALUES ('tbl_1',action_utilisateur,TO_CHAR(SYSDATE, 'DD/MON/YYYY'),
                           TO_CHAR(SYSDATE, 'HH24:MI:SS'));
  END;

-- Second exemple 
CREATE TABLE tbl_1 (col_a INTEGER, col_b CHAR(20));
CREATE TABLE tbl_2 (col_c CHAR(20), col_d INTEGER);

CREATE TRIGGER declencheur_insertion
  AFTER INSERT ON tbl_1
  FOR EACH ROW
  WHEN (NEW.col_a <= 10)
  BEGIN
      INSERT INTO tbl_2 VALUES(:NEW.col_b, :NEW.col_a);
  END;

Le premier exemple crée un déclencheur qui insère un champ log à l'intérieur d'une table, pour chaque ligne supprimée dans la table spécifiée.

Le second exemple crée un déclencheur qui insére un enregistrement à l'intérieur de la seconde table lorqu'une opération d'insertion s'est accomplie dans la première table. Le déclencheur vérifie si le nouvel enregistrement possède un premier composant inférieur ou égal à 10 et si c'est le cas, inverse les enregistrements à l'intérieur de la seconde table.

Les variables spéciales NEW et OLD sont disponibles pour se référer respectivement à des nouveaux ou d'anciens enregistrements. Les deux points (:) précédent NEW et OLD dans VALUES sont dans ce cas obligatoires, par contre dans la clause conditionnelle WHEN, ils doivent être omis.