Überblick
Oracle bietet eine Fülle an Werkzeugen, um Datenintegrität und Datenqualität zu gewährleisten. Diese werden allgemein unter dem Begriff CONSTRAINT zusammengefasst. Dazu gehören unter anderem
- Primary Key Constraint
- Unique Key Constraint
- Foreign Key Constraint
- Check Constraint
Was sie alle gemeinsam haben, ist die Tatsache, dass sie (außer über komplexe und Performance-seitig schwache Umwege wie Funktionen in Check Constraints oder Materialized Views)
- Nur eine Tabelle prüfen können
- Innerhalb einer Tabelle nicht über mehrere beliebige Zeilen prüfen können
Üblicherweise wurden solche Themen dann applikatorisch gelöst, was aber keine Garantie für korrekte Daten ist, da
- Randfälle vergessen werden
- Aus Wartungsgründen API Funktionen ohne diese Checks existieren
- Direkte Datenmanipulation in der Datenbank davon nicht berührt werden
Wenn nun beispielsweise in Verwaltungssystem für mehrere Schulen hat, dann sollen in diesem z.B. folgende Dinge gesichert sein:
- Fächer eines Lehrers dürfen sich innerhalb eines Schuljahres zeitlich nicht überschneiden
- Jeder Lehrer unterrichtet pro Schuljahr in maximal 4 verschiedenen Klassen
- Jeder Lehrer unterrichtet pro Schuljahr zumindest 5 Einheiten
Hier kommt mit Oracle 26ai (Release 23.26.1) ein neues Feature, um genau diese Prüfungsmöglichkeit nativ in der Datenbank zu entwickeln. Das Feature nennt sich Assertions – es hat aber außer der Namensähnlichkeit nichts mit dem Oracle Package dbms_assert zu tun.
Gehen wir von folgendem Datenmodell aus:
- Tabelle Schuljahre
- ID
- Name
- Tabelle Klassen
- ID
- Bezeichnung
- Fächer
- ID
- Bezeichnung
- Lehrer
- ID
- Name
- Stunden
- ID
- Schuljahr-ID
- Klassen-ID
- Fach-ID
- Lehrer-ID
- Beginn (Uhrzeit in Minuten also 480 für 08:00)
- Ende (Uhrzeit in Minuten also 480 für 08:00)
Assertion 3
Die dritte Assertion soll sicherstellen, dass jeder Lehrer muss pro Schuljahr mindestens 5 Einheiten unterrichtet. Eine entsprechende Assertion könnte so aussehen:
Es werden die Einheiten 5-mal miteinander verknüpft und sichergestellt, dass sich die Fächer bzw. Klassen bei den 5 Abfragen immer unterscheiden. Sollte ein Lehrer weniger als 5 Fächer unterrichten, würde die Assertion einen Fehler ausgeben. Die Keywords am Ende funktionieren analog zu anderen Constraints – sie verschieben die Validierung ans Ende der Transaktion. Wenn ich nun einen neuen Lehrer eintrage und die 5 Fächer ebenfalls und erst danach ein Commit ausführe, dann ist die Assertion erfüllt z.B. wie folgt:
Nun könnte man das ganze einfacher und eleganter über eine Aggregation wie COUNT(*) lösen – das gehört aber lt. Oracle Doku momentan noch zu den nicht unterstützten Möglichkeiten (eine Auflistung der wichtigsten Einschränkungen folgt am Ende).
Um die doppelten NOT EXIST zu umgehen welche wenig intuitiv sind, hat Oracle noch eine zusätzliche Syntax des SATISFY … ALL entwickelt. Wir können die dritte Assertion mit dieser Syntax umschreiben, dann würde sie wie folgt aussehen:
Einschränkungen
Die wichtigsten Einschränkungen sind die folgenden:
- Keine Aggregationen (also kein COUNT, MAX, MIN) oder Analytischen Funktionen
- Keine ANSI JOINS (also kein JOIN ON)
- Keine Tabellen die SYS-Owned sind – das inkludiert unter anderem DUAL
- Keine nicht-deterministischen Funktionen wie z.B. SYSDATE
More information can be found here: CREATE ASSERTION

Christoph Hillinger ist Senior Oracle Developer und seit vielen Jahren Oracle APEX und ODI Spezialist bei DBConcepts.


