
Depuis l’introduction du standard SQL en 1992, les Assertions figuraient dans les spécifications comme une fonctionnalité fondamentale du modèle relationnel. Pourtant, malgré trois décennies d’existence dans le standard, aucun éditeur majeur n’avait franchi le pas. Oracle AI Database 26ai (Release Update 23.26.1, janvier 2026) est le premier à concrétiser cette promesse en implémentant les Assertions SQL, une avancée majeure pour le monde des SGBD relationnels.
Vous vous posez peut-être la question : qu’est-ce qu’une Assertion en SQL ? Il s’agit d’une contrainte d’intégrité déclarative définie au niveau du schéma, capable d’imposer une règle métier sur plusieurs lignes et plusieurs tables simultanément, contrairement aux contraintes classiques comme CHECK ou FOREIGN KEY qui opèrent sur une seule table à la fois.
Et pourquoi personne ne l’avait implémentée avant ? Parce que garantir l’évaluation d’une règle globale après chaque opération DML, sans impacter les performances en production, représentait un défi technique considérable que les moteurs de bases de données avaient jusqu’ici contourné plutôt que résolu.
Définition et fonctionnement
Une assertion est une contrainte d’intégrité déclarative définie au niveau du schéma. Elle encapsule une expression SQL booléenne que le moteur évalue automatiquement après chaque opération DML concernée. Si l’expression retourne FALSE, Oracle annule l’instruction et lève l’erreur :
ORA-08601: SQL assertion (SCHEMA.NOM_ASSERTION) violated.Langage du code : CSS (css)La syntaxe de création est la suivante :
CREATE ASSERTION nom_assertion
CHECK ( <expression SQL booléenne> )
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY IMMEDIATE | INITIALLY DEFERRED ];Langage du code : CSS (css)Exemple d’utilisation : contrôle des ventes par statut de magasin
Pour illustrer l’utilité des assertions, prenons un cas concret issu du monde réel : interdire l’enregistrement d’une vente dans un magasin fermé (OUVERT = 'N'). Cette règle métier, simple en apparence, implique deux tables et ne peut être exprimée par aucune contrainte déclarative standard. C’est précisément dans ce type de situation que les assertions prennent tout leur sens.
Création des tables
-- Table des magasins avec leur statut d'ouverture
CREATE TABLE MAGASIN (
MAGASIN_ID NUMBER(2) PRIMARY KEY,
NOM VARCHAR2(20) NOT NULL,
OUVERT CHAR(1) NOT NULL CHECK (OUVERT IN ('O', 'N'))
);
-- Table des ventes associées à un magasin
CREATE TABLE VENTE (
VENTE_ID NUMBER(4) PRIMARY KEY,
MAGASIN_ID NUMBER(2) NOT NULL REFERENCES MAGASIN(MAGASIN_ID),
REFERENCE VARCHAR2(20) NOT NULL,
MONTANT NUMBER(8,2) NOT NULL
);Langage du code : PHP (php)Insertion des données
-- Magasins : deux ouverts, un fermé
INSERT INTO MAGASIN VALUES (1, 'CASA CENTRE', 'O');
INSERT INTO MAGASIN VALUES (2, 'RABAT AGDAL', 'O');
INSERT INTO MAGASIN VALUES (3, 'TANGER PORT', 'N');
-- Ventes existantes (uniquement dans des magasins ouverts)
INSERT INTO VENTE VALUES (1, 1, 'BRE-F450', 850);
INSERT INTO VENTE VALUES (2, 2, 'MAN-HU718', 120);
INSERT INTO VENTE VALUES (3, 1, 'MON-G8162', 430);
COMMIT;Langage du code : JavaScript (javascript)Création de l’assertion
-- Aucune vente ne peut être enregistrée dans un magasin fermé
CREATE ASSERTION PAS_VENTE_MAGASIN_FERME
CHECK (
NOT EXISTS (
SELECT 'vente magasin ferme'
FROM VENTE v, MAGASIN m
WHERE v.MAGASIN_ID = m.MAGASIN_ID
AND m.OUVERT = 'N'
)
);Langage du code : JavaScript (javascript)Démonstration du comportement
Cas 1 — Insertion valide : enregistrement d’une vente dans un magasin ouvert
INSERT INTO VENTE VALUES (4, 1, 'SKF-VKD', 290);
-- 1 row inserted. (CASA CENTRE est ouvert ✔)
COMMIT;Langage du code : JavaScript (javascript)Cas 2 — Insertion rejetée : tentative d’enregistrement d’une vente dans le magasin TANGER PORT, dont le statut est fermé
INSERT INTO VENTE VALUES (4, 3, 'SKF-VKD', 290);
-- ORA-00001: violation de contrainte unique (ADMIN.SYS_C008593) sur la table ADMIN.VENTE colonnes (VENTE_ID)Langage du code : JavaScript (javascript)Cas 3 — Mise à jour rejetée : tentative de fermeture d’un magasin ayant des ventes actives
UPDATE MAGASIN
SET OUVERT = 'N'
WHERE MAGASIN_ID = 1;
-- Erreur SQL : ORA-08601: Violation de l'assertion SQL (ADMIN.PAS_VENTE_MAGASIN_FERME).
-- (CASA CENTRE possède des ventes enregistrées)Langage du code : PHP (php)Le contrôle s’applique dans les deux sens : sur les insertions de commandes et sur les modifications du stock. Aucun chemin d’accès ne contourne la règle.
Gestion des états
- ENABLE VALIDATE : Validation des données existantes + contrôle de tout DML futur. État par défaut à la création.
- ENABLE NOVALIDATE : Données existantes non vérifiées. Contrôle actif sur les DML futurs.
- DISABLE VALIDATE : Données existantes préalablement validées. DML non contrôlé.
- DISABLE NOVALIDATE : Contrainte entièrement désactivée. Aucun contrôle.
Assertions différables
Pour les transactions complexes nécessitant une violation temporaire d’une règle en cours d’exécution, Oracle supporte les assertions différables. La vérification est alors reportée au moment du COMMIT :
CREATE ASSERTION PAS_VENTE_MAGASIN_FERME_DIFFERE
CHECK (
NOT EXISTS (
SELECT 'vente magasin ferme'
FROM VENTE v, MAGASIN m
WHERE v.MAGASIN_ID = m.MAGASIN_ID
AND m.OUVERT = 'N'
)
)
DEFERRABLE INITIALLY DEFERRED;Langage du code : JavaScript (javascript)Ce mode est particulièrement adapté aux scénarios où le statut d’un magasin et ses ventes associées sont mis à jour dans la même transaction.
Privilèges et vues du dictionnaire
-- Octroi du privilège de création d'assertions
GRANT CREATE ASSERTION TO nom_utilisateur;
-- Rôle développeur intégré (inclut CREATE ASSERTION)
GRANT DB_DEVELOPER_ROLE TO nom_utilisateur;
-- Consultation des assertions du schéma courant
SELECT assertion_name, status, validated, deferrable, deferred
FROM user_assertions;
-- Dépendances des assertions
SELECT * FROM user_assertion_dependencies;Limitations de la version courante
En tant que première implémentation native dans un moteur de base de données relationnel, les Assertions Oracle 26ai posent des bases solides tout en restant soumises à certaines contraintes du moteur SQL. Certaines constructions avancées ne sont pas encore supportées dans cette version initiale et feront sans aucun doute l’objet d’évolutions dans les prochaines releases.
Poster un Commentaire