Oracle Database · · 3 Min.

IF EXISTS für DDL in 26ai

Wie Schema-Skripte wiederholbar werden, ohne Objektfehler zu verschlucken.

Wiederholbare DDL-Skripte sind eine wichtige Grundlage für Releases, Testdatenbanken und automatisierte Migrationen. Bisher mussten Entwickler häufig vorher in Dictionary-Views prüfen, ob ein Objekt existiert, oder erwartete Fehler in PL/SQL behandeln. Oracle AI Database 26ai unterstützt dafür IF NOT EXISTS bei CREATE sowie IF EXISTS bei vielen ALTER- und DROP-Anweisungen.

Einordnung: Die Klauseln unterdrücken einen Existenzfehler. Sie vergleichen aber nicht automatisch die Definition eines vorhandenen Objekts mit dem gewünschten Zielzustand.

1. CREATE sicher wiederholen

Bei CREATE verhindert IF NOT EXISTS, dass ein Skript fehlschlägt, wenn das Objekt bereits vorhanden ist:

CREATE TABLE IF NOT EXISTS release_marker (
  release_id VARCHAR2(40) PRIMARY KEY,
  applied_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL
);

Existiert die Tabelle bereits, bleibt sie unverändert. Das ist ideal für eine Initialisierung oder ein Setup, bei dem die Existenz genügt. Für eine strukturelle Migration reicht es nicht: Wenn eine Spalte, ein Constraint oder ein Index fehlt, braucht es weiterhin einen separaten, bewusst geprüften ALTER-Schritt.

2. ALTER und DROP mit IF EXISTS

Bei ALTER und DROP dreht sich die Logik um: IF EXISTS unterdrückt den Fehler, wenn das Zielobjekt nicht vorhanden ist:

ALTER TABLE IF EXISTS release_marker
  ADD (source_system VARCHAR2(40));

DROP TABLE IF EXISTS old_release_marker;

Das macht Cleanup- und Rollback-Skripte robuster, wenn verschiedene Zielumgebungen leicht unterschiedliche Zwischenstände haben. Der Einsatz sollte trotzdem dokumentiert werden. Ein still übersprungener DROP kann genauso relevant sein wie ein fehlgeschlagener DROP, besonders wenn ein altes Objekt aus Sicherheits- oder Compliance-Gründen entfernt werden sollte.

3. Idempotent heißt nicht automatisch korrekt

Ein idempotentes Skript kann mehrfach laufen, ohne bei jedem Lauf einen Existenzfehler zu erzeugen. Es beweist aber nicht, dass das Schema korrekt ist. Ein vorhandener Tisch mit falschem Datentyp oder fehlender Spalte wird von CREATE TABLE IF NOT EXISTS akzeptiert und bleibt falsch.

Für produktive Migrationen gehört deshalb ein Zustandscheck dazu: erwartete Spalten, Datentypen, Constraints, Indizes, Kommentare und Annotationen werden über Dictionary-Views gegen die gewünschte Version geprüft. Erst wenn der Zustand passt, sollte der nächste Migrationsschritt als erfolgreich markiert werden.

4. OR REPLACE nicht kombinieren

OR REPLACE und IF NOT EXISTS dürfen nicht gemeinsam in derselben CREATE-Anweisung verwendet werden. Beide ausdrücken unterschiedliche Absichten: OR REPLACE soll eine vorhandene Definition ersetzen, IF NOT EXISTS soll sie unverändert bestehen lassen. Für eine Änderung an einem bestehenden Objekt muss der Change daher explizit als ALTER, CREATE OR REPLACE oder versionierte Migration modelliert werden.

5. Sicheres DDL-Runbook

  1. Unterstützten Objekttyp und korrekte Klausel für CREATE, ALTER oder DROP prüfen.
  2. Existenzprüfung von Definitionprüfung trennen.
  3. Vor jedem ALTER/DROP den erwarteten Ausgangszustand und Abhängigkeiten dokumentieren.
  4. Dictionary-Checks für Spalten, Rechte, Constraints und Indizes automatisieren.
  5. Stille No-op-Ergebnisse im Deployment-Log sichtbar machen.
  6. Migrationen in Test, Staging und Produktion mit nachvollziehbarer Versionsmarke ausführen.
Praxisregel: Verwende IF EXISTS für robuste Wiederholbarkeit, aber verlasse dich für Schema-Korrektheit auf explizite Zustandsprüfungen und versionierte Migrationen.

Fazit

Die neuen IF-EXISTS-Klauseln in Oracle AI Database 26ai vereinfachen DDL-Skripte und reduzieren unnötige Fehlerbehandlung. Ihr sicherer Einsatz verlangt jedoch eine klare Unterscheidung zwischen „Objekt ist vorhanden“ und „Objekt entspricht der erwarteten Definition“. In Kombination mit Dictionary-Checks und sichtbaren Deployment-Logs werden daraus belastbare Migrationen.

Weiterführend: Oracles Anleitung zu IF EXISTS und IF NOT EXISTS, die CREATE-TABLE-Referenz und die Neuerungen in Oracle AI Database 26ai.