13.3 Integritätskontrolle

Aufgaben der Integritätskontrolle sind die Überwachung und Einhaltung der logischen DB-Konsistenz. Grundsätzlich lassen sich diese Aufgaben entweder auf Anwendungsebene oder zentral durch das DBS realisieren. Wie bei der Diskussion der ACID-Eigenschaften deutlich wurde, ist dabei eine möglichst weitgehende Integritätskontrolle durch das DBS anzustreben, insbesondere um die Abhängigkeiten zur Korrektheit der Anwendungsprogramme zu reduzieren. Die zentrale Definition und Überwachung semantischer Integritätsbedingungen ermöglicht zudem eine Vereinfachung der Anwendungsentwicklung, da die entsprechenden Prüfungen nicht (redundant) in zahlreichen Programmen auszuprogrammieren sind, welche zudem bei Änderungen in den Integritätsbedingungen mit hohem Aufwand anzupassen wären (schlechte Wartbarkeit). Auch kann die DBS-interne Überprüfung von Integritätsbedingungen zu Leistungsvorteilen führen, insbesondere durch Einsparung von DBS-Aufrufen. Schließlich wird auch eine Integritätskontrolle für DB-Änderungen erreicht, welche nicht über den Aufruf von Transaktionsprogrammen, sondern direkt (ad hoc)[3] vorgenommen werden. In kommerziellen DBS stehen mittlerweile zunehmend Mechanismen zur Integritätskontrolle bereit, zumal im SQL92-Standard [DATE97] umfassende Möglichkeiten zur Spezifikation von Integritätsbedingungen festgelegt wurden.

Wir diskutieren im folgenden kurz unterschiedliche Typen von Integritätsbedingungen sowie ihre Unterstützung in SQL. Es folgt eine Diskussion von Triggern und ECA-Regeln, welche nach integritätsgefährdenden Änderungen eine aktive Reaktion ermöglichen, um die DB-Konsistenz aufrechtzuerhalten. Weiterhin wird auf Implementierungsaspekte der DBS-seitigen Integritätskontrolle eingegangen (Abschnitt 13.3.3).


13.3.1 Arten von Integritätsbedingungen

Semantische Integritätsbedingungen lassen sich hinsichtlich mehrerer Kategorien klassifizieren: SQL92 gestattet die deklarative Spezifikation all dieser Typen von Integritätsbedingungen mit Ausnahme dynamischer Integritätsbedingungen. Im einzelnen stehen hierzu folgende Sprachmittel zur Verfügung (selbsterklärende Beispiele dazu zeigt Abb. 13.4):

Zur Einhaltung der DB-Konsistenz (integrity enforcement) ist die Standard-Reaktion auf die erkannte Verletzung einer Integritätsbedingung der Abbruch der betreffenden Änderungstransaktion. In [ESWA75] wurde daneben für die Verletzung "schwacher Integritätsbedingungen" (soft assertions) eine anwendungsseitige Reaktionsmöglichkeit vorgesehen, z. B. für interaktive Interventionsmöglichkeiten des Benutzers, Ausgabe von Fehlermeldungen, Aufruf von Korrekturprogrammen usw. Diese Vorgehensweise erlaubt zwar eine hohe Flexibilität, verlagert jedoch die Verantwortung zur Integritätskontrolle wieder auf die Anwendungsseite und widerspricht somit dem Hauptanliegen DBS-basierter Integritätskontrolle. Da zudem die Verletzung definierter Integritätsbedingungen mit dem Transaktionskonzept nicht vereinbar ist, wäre eine anwendungsseitige Reaktionsmöglichkeit nur dann akzeptabel, wenn danach vor dem endgültigen Commit die Einhaltung der Integritätsbedingungen erneut überprüft würde und bei Verletzung ein Transaktionsabbruch erfolgt.

Eine Alternative besteht darin, eine DBS-kontrollierte Reaktion auf die Verletzung einer Integritätsbedingung vorzusehen, welche zusammen mit der Integritätsbedingung zu spezifizieren ist. Solche erweiterten Integritätsbedingungen werden als Integritätsregeln bezeichnet und enthalten die Festlegung einer Reaktionsmöglichkeit zur Wahrung der DB-Konsistenz. Die in SQL92 vorgesehenen Spezifikationsmöglichkeiten zur Wartung der referentiellen Integrität (CASADE, SET NULL, SET DEFAULT, NO ACTION) sind Beispiele solcher Integritätsregeln (die Default-Reaktion, in SQL3 als RESTRICT-Option explizit zu spezifizieren, bewirkt die Abweisung einer Operation/Transaktion, welche zu einer Verletzung der referentiellen Integrität führt, und entspricht somit der Standard-Reaktion für verletzte Integritätsbedingungen).

Solche Regelmengen gestatten eine deklarative Beschreibung von Situationen/Ereignissen und den zugehörigen Reaktionen, ohne dabei die Programmabläufe, in denen sie auftreten können, vorausplanen und spezifizieren zu müssen. Die Erkennung solcher Situationen/Ereignisse und die prozedurale Umsetzung der spezifizierten Reaktion wird dabei dem DBS überlassen. Weiterhin gestatten sie eine leichte Erweiterbarkeit, was Hinzufügen, Löschen und Austauschen von Regeln sehr einfach gestaltet. Allerdings können Abhängigkeiten zwischen Regeln auftreten, wenn sie auf gemeinsame Daten Bezug nehmen und dabei Änderungen vollzogen werden. Das wird immer dann zu einem Problem bei der Regelausführung, wenn mehrere Regeln gleichzeitig ausgelöst und diese parallel bearbeitet werden sollen [REIN96].


13.3.2 Trigger-Konzept und ECA-Regeln

Die Überwachung dynamischer Integritätsbedingungen sowie die Spezifikation allgemeiner Integritätsregeln werden durch das Trigger-Konzept möglich, das von den meisten DBS bereits unterstützt wird; seine Standardisierung erfolgt jedoch erst in SQL3. Ein Trigger erlaubt für Änderungen auf Tabellen die Definition von automatisch ausgelösten Folgeaktivitäten. Eine derartige Folgeaktivität wird durch eine SQL-Anweisung spezifiziert; durch den Aufruf einer gespeicherten Prozedur (stored procedure) können beliebig umfangreiche Verarbeitungsvorgänge angestoßen werden. Die Ausführung der Folgeaktionen läßt sich von der Gültigkeit bestimmter Bedingungen abhängig machen, wobei zur Bedingungsauswertung die Werte vor und nach der Änderung berücksichtigt werden können. Wie in Abb. 13.5 a unter Verwendung der vorgesehenen SQL3-Syntax gezeigt, erlaubt dies u. a. die Realisierung dynamischer Integritätsbedingungen, indem bei einem unzulässigen Zustandsübergang (WHEN-Klausel) als Folgeaktion die betreffende Transaktion abgebrochen wird (ROLLBACK).

Trigger können auch zur Überwachung statischer Integritätsbedingungen sowie zur Wartung der referentiellen Integrität herangezogen werden. Für einige DBS, welche die SQL92-Konstrukte zur Festlegung von Integritätsbedingungen nur begrenzt unterstützen, ist dies teilweise auch die einzige Möglichkeit, die fehlende Funktionalität auszugleichen. In Abb. 13.5 b ist z. B. gezeigt, wie die Fremdschlüsselbedingung aus Abb. 13.4 über einen Trigger realisiert werden kann. Trigger gestatten darüber hinaus die Formulierung von allgemeinen Integritätsregeln, da als Folgeaktion beliebig komplexe Vorgänge zur Herstellung eines konsistenten DB-Zustandes möglich sind oder auch um vor dem Transaktionsabbruch noch Benachrichtigungen an den Benutzer zu liefern. Es handelt sich dabei um eine weitgehend prozedurale Spezifikation, bei welcher der Zeitpunkt der Trigger-Ausführung (i. allg. vor bzw. nach Ausführung einer Änderungsoperation), die Verwendung alter und neuer DB-Werte sowie die einzelnen Aktionen genau festzulegen sind.

Ein derartiger Einsatz von Triggern hat im Vergleich zur Nutzung der deklarativen SQL92-Konstrukte wesentliche Nachteile:

Aus diesen Überlegungen folgt, daß benutzerseitig der Verwendung deklarativ definierter Integritätsbedingungen Vorrang einzuräumen ist. Der Trigger-Einsatz sollte auf Einsatzbereiche begrenzt werden sollte, die darüber nicht abgedeckt werden können, insbesondere die Realisierung dynamischer Integritätsbedingungen und spezifischer Integritätsregeln. Allerdings kann das Trigger-Konzept aufgrund seiner operationalen Semantik DBS-intern als Implementierungsmöglichkeit für nahezu alle Integritätsbedingungen genutzt werden (s. u.). Darüber hinaus gestattet die hohe Flexibilität des Trigger-Konzeptes, es neben der Integritätskontrolle zur Realisierung vielfältiger Kontrollaufgaben heranzuziehen, z. B. Aktualisierung replizierter Datenbestände, Protokollierung von DB-Zugriffen für Auditing-Zwecke, automatische Auslösung von Benachrichtigungen, usw. Ähnlich wie bei der Integritätskontrolle ist es äußerst wünschenswert, diese Aufgaben zentralisiert durch das DBS anstatt über Anwendungsprogramme zu realisieren (Umgehen redundanter Implementierungen in verschiedenen Anwendungsprogrammen, bessere Wartbarkeit und Modularisierung von Anwendungen, Leistungsvorteile, ...).

Eine Verallgemeinerung der Trigger-Funktionalität wird von aktiven Datenbanksystemen [JASP98, WIDO96a] verfolgt. Sie verwenden anstelle von Triggern sog. ECA-Regeln, welche durch drei Komponenten gekennzeichnet sind:

Zwischen Event, Bedingungsauswertung sowie Ausführung der Aktionen wurden unterschiedliche "Kopplungsmodi" vorgeschlagen [HSU88]. Damit wird es z. B. möglich, Bedingungsauswertung und Ausführung von Aktionen vom auslösenden Ereignis zu entkoppeln, um sie verzögert am Transaktionsende oder gar innerhalb separater Transaktionen durchzuführen. Einige Nachteile des Trigger-Ansatzes können somit umgangen werden. Auf der anderen Seite verstärkt die höhere Ausdrucksmächtigkeit die Probleme bezüglich der sicheren Nutzung und erhöht die Notwendigkeit einer Tool-Unterstützung beim Entwurf von Anwendungen und ECA-Regeln. Überlegungen zum Entwurf von Triggern bzw. Regeln finden sich u. a. in [ZANI97].


13.3.3 Implementierungsaspekte

Die DBS-seitige Durchführung der Integritätskontrolle erfordert die Generierung und Ausführung zusätzlicher DB-Operationen für Änderungstransaktionen, um die Verletzung definierter Integritätsbedingungen zu erkennen. Hierzu ist vom DBS zu entscheiden, Die Unterstützung von Integritätsregeln bringt wesentlich weitergehende Anforderungen mit sich, insbesondere eine aufwendigere Überwachung von regelauslösenden Ereignissen, die effiziente Bedingungsauswertung und Ausführung der ausgelösten Folgeoperationen sowie die Überwachung der dabei rekursiv verursachten Regelaktivierungen.

Für Transaktionsprogramme können im Rahmen der Vorübersetzung durch einen Prä-Compiler Operationen zur Prüfung von Integritätsbedingungen sowie zur Reaktion auf Integritätsverletzungen eingebettet werden. Voraussetzung dafür ist - wie bei statischem eingebettetem SQL der Fall - daß neben den jeweiligen Änderungsoperationen auch die Namen der betroffenen Tabellen und Attribute erkannt werden. Die Prüfanweisungen können sich dabei auf einzelne Änderungsoperationen oder aber das gesamte Transaktionsprogramm beziehen, etwa um verzögerte Integritätsbedingungen zu überwachen.

Da mit dieser Technik jedoch keine dynamischen SQL-Anweisungen sowie direkte (Ad-hoc-) Änderungen unterstützt werden können, ist eine weitergehende Integritätskontrolle erforderlich. So sind bei der Übersetzung und Optimierung von Änderungsoperationen im Ausführungsplan direkt entsprechende Prüfoperationen zu erzeugen, oder es erfolgt der Aufruf dynamischer Prüfroutinen eines eigenen Integritäts-Subsystems (bzw. eines Regel-Subsystems). Aus Leistungsgründen ist beim Aufruf solcher Prüfroutinen möglichst viel Kontextinformation zur Überprüfung bereitzustellen, um die Anzahl zu prüfender Integritätsbedingungen auf ein Minimum zu beschränken. Insbesondere sollte es möglich sein, die Prüfungen auf die von einer Änderung betroffenen Daten zu beschränken, um nicht große Teile der Datenbank auswerten zu müssen (z. B. bei Einfügen eines neuen Satzes sind die Integritätsbedingungen nur für diesen zu prüfen, nicht für die gesamte Tabelle).

Eine im Rahmen der Anfrageoptimierung nutzbare Technik zur Integritätskontrolle ist die für das DBS Ingres vorgeschlagene Anfragemodifikation (Query Modification) [STON75]. Dabei erfolgt eine Transformation von Änderungsoperationen durch Hinzunahme von Prädikaten einzuhaltender Integritätsbedingungen, so daß durch die resultierende Operation eine Verletzung der betreffenden Bedingungen umgangen wird. Diese in Abb. 13.6 beispielhaft illustrierte Methode ist jedoch nur für einfache statische und unverzögerte Integritätsbedingungen nutzbar. Sie führt zudem entgegen der üblichen Vorgehensweise nicht zum Abbruch der Transaktion, sondern verhindert lediglich die Ausführung einer integritätsgefährdenden Änderungsanweisung, was bei Transaktionen mit mehreren Operationen zu unerwarteten Effekten führen kann. Der offensichtliche Vorteil der Query-Modifikation liegt darin, daß die Integrität mit den vorhandenen Ausführungsmechanismen des DBS sichergestellt wird.

Eine allgemeine Realisierungsmöglichkeit zur Integritätskontrolle besteht darin, Trigger bzw. ECA-Regeln innerhalb des DBS heranzuziehen, selbst wenn eine deklarative Spezifikation der Integritätsbedingungen erfolgt. Denn wie erwähnt lassen sich darüber die meisten (einschließlich dynamischer) Integritätsbedingungen realisieren, wobei jedoch auch verzögerte Bedingungen zu unterstützen sind. Die Implementierung des ECA-Konzeptes ermöglicht darüber hinaus die Realisierung zahlreicher weiterer Kontrollaufgaben aktiver DBS. Die effektive Generierung von ECA-Regeln aus einer deklarativen Spezifikation von Integritätsbedingungen ist im allgemeinen Fall ein komplexes Problem und wurde u. a. in [GREF93, CERI94, GERT94] untersucht. Die Realisierung eines umfassenden Regelsystems steht für kommerzielle DBS noch aus, jedoch gibt es erste Implementierungen im Rahmen von Prototypen wie Postgres und Starburst.

In Postgres wurden zwei unterschiedliche Arten der Regelbehandlung realisiert [STON90, POTA96], wobei für jede Regel eine der beiden Realisierungsmöglichkeiten auszuwählen ist. Defaultgemäß wird ein zur Laufzeit wirksam werdendes und auf Tupelebene arbeitendes Regelsystem verwendet (tuple level rule system). Dabei werden bei der Spezifikation einer neuen Regel alle Tupel der Datenbank (bzw. ganze Relationen), welche die Qualifizierungsbedingung der Regel zu diesem Zeitpunkt erfüllen, mit einer permanenten Markierung für die Regel ("rule lock") versehen. Bei der Abarbeitung von Operationen wird für ein Tupel für alle Regeln, zu denen eine Markierung vorgefunden wird, eine entsprechende Regelauswertung angestoßen. Als Alternative wird ein zur Übersetzungszeit von DB-Operationen wirkender Query-Rewrite-Ansatz zur Regelbehandlung unterstützt, der eine Erweiterung der diskutierten Query-Modifikation darstellt. Die Entwickler räumen ein, daß die beiden Ansätze unter Umständen zu unterschiedlichen Ergebnissen führen können. In der vorgenommenen Implementierung ist die Regelauswertung auch direkt an DB-Operationen gekoppelt; eine als machbar angesehene verzögerte Auswertung von Regeln am Transaktionsende wurde nicht realisiert.

Demgegenüber liegt der Schwerpunkt des Regelsystems für den DBS-Prototyp Starburst in der mengenorientierten Regelauswertung am Ende von Transaktionen [WIDO91, WIDO96b]. Pro Transaktion werden dabei für jede geänderte Tabelle vier temporäre Relationen (transition tables) mit den von Änderungen betroffenen Sätzen geführt. In den Tabellen deleted und inserted werden dabei die gelöschten und eingefügten Sätze aufgenommen, während die Tabellen old-updated und new-updated für geänderte Sätze die Werte vor und nach der Änderung enthalten. Diese Tabellen ermöglichen eine Begrenzung der Regelauswertung auf die minimale Menge relevanter Daten. Die Nutzung dieser Tabellen wird innerhalb der Regeln festgelegt, welche für deklarativ spezifizierte Integritätsbedingungen im allgemeinen automatisch vom Compiler erzeugt werden können (siehe Beispiel in Abb. 13.7 unter Verwendung der Starburst-Syntax). In der Realisierung wurde der effizienten Verarbeitung rekursiv ausgelöster Regeln besondere Beachtung gewidmet, worauf hier jedoch nicht näher eingegangen werden kann.

Die zur Integritätskontrolle erforderlichen DB-Operationen führen natürlich generell zu einer Erhöhung der DBS-Last, welche auch beim physischen DB-Entwurf zu berücksichtigen ist. Anderenfalls kann die Überprüfung von Integritätsbedingungen zu intolerabel häufigen Relationen-Scans mit zahlreichen E/A-Vorgängen und hohem Sperrpotential führen. In [HÄRD92b, HÄRD96] wird die Zugriffspfadunterstützung zur effizienten Gewährleistung der Relationalen Invarianten untersucht. Es stellt sich u. a. heraus, daß aus Leistungsgründen dabei für jeden Primär- und Fremdschlüssel eine Indexunterstützung erforderlich ist. In [SIMO95] wurden für Trigger kommerzieller DBS zum Teil erhebliche Leistungsprobleme festgestellt, mitbedingt durch eine hohe Ausführungsfrequenz sowie verschärfte Sperrengpässe. In [BRÜC97] konnte für eine konkrete Anwendung der Einsatz von Triggern zur Integritätskontrolle im Einbenutzerbetrieb etwas bessere Leistungsmerkmale als eine anwendungsseitige Realisierung bewirken, insbesondere aufgrund der Einsparung an DBS-Aufrufen; noch bessere Antwortzeiten wurden jedoch bei Einsatz deklarativer Integritätsbedingungen gemessen.


[3] Solche direkten Änderungen werden vom DBS implizit als Transaktionen abgewickelt.