Wie beliebte Datenbanken mit DDL-Befehlen in Transaktionen umgehen
Die Integration von DDL-Befehlen in Transaktionen ist eine der leistungsstärksten Funktionen, die Datenbanken bieten. Aber nicht alle Datenbanken sind in der Lage, DDL-Änderungen rückgängig zu machen. Oracle, PostgreSQL, MySQL, MariaDB, DB2, MSSQL, Teradata, Greenplum, Netezza, Redshift, Aurora sind die beliebtesten relationalen Datenbanken und dieser Artikel beschreibt ihre Fähigkeit, DDL-Befehle in Transaktionen zu unterstützen.
Eine Transaktion ist eine Folge von Befehlen, die in eine logische Einheit integriert sind. Somit wird eine Transaktion als eine Einheit ausgeführt. Wenn die Ausführung der Transaktion unterbrochen wird, wird die Transaktion überhaupt nicht ausgeführt. Transaktionen werden verwendet, um die Datenbankintegrität zu bewahren, da die einmalige Ausführung aller Befehle in einer Transaktion die Integritätsbedingungen speichert und es unmöglich macht, die Datenbank in einem Übergangszustand ohne Konsistenz zu hinterlassen.
DDL (Data Definition Language) ist eine Familie von SQL-Sprachenelementen, die zur Definition der Datenbankstruktur verwendet werden (einschließlich Operationen mit Datenbanken, Tabellen, Spalten, Indizes, Ansichten, gespeicherten Prozeduren, Constraints).
Um zu verstehen, was DDL ist, ist es wichtig zu wissen, dass DDL-Anweisungen eine entscheidende Rolle in Datenbankverwaltungssystemen (DBMS) spielen, indem sie es Benutzern ermöglichen, die Struktur der Datenbank zu definieren und zu ändern. Die Fähigkeit, DDL in Datenbankverwaltungssystemen auszuführen, ist entscheidend für die Aufrechterhaltung der Integrität und Konsistenz der in der Datenbank gespeicherten Daten. Allerdings variiert das Verhalten von DDL-Anweisungen in Transaktionen zwischen verschiedenen DBMS-Implementierungen. Das Verständnis, wie sich DDL-Anweisungen in Transaktionen in Ihrem spezifischen DBMS verhalten, ist entscheidend, um die Datenintegrität sicherzustellen und geeignete Fehlerbehandlungsmechanismen zu implementieren.
Unsere DataSunrise Database Security Suite ist speziell für den Schutz relationaler Datenbanken gegen unbefugten Zugriff und Datenlecks entwickelt. Um diese Aufgabe zu erfüllen, wird ein leistungsstarkes System von Sicherheitspolicies (die Regeln) zur Zugriffsbegrenzung und dynamischen Datenmaskierung implementiert. Um diese Funktionalität zu nutzen, muss unser Programm den Zustand der Datenbankmetadaten zu jedem Zeitpunkt kennen. Metadaten sind die Datenbankschema- und Systemvariablenwerte-Sätze, die die Abfrageausführung und die Interpretation der Ergebnisse beeinflussen. Metadaten können durch das Senden einer Reihe von Abfragen an den Datenbankserver abgerufen werden.
DataSunrise unterstützt auch die Verfolgung inkrementeller Änderungen und protokolliert die Ausführungsergebnisse von DDL-Befehlen, die von unserem Produkt verarbeitet werden. Der wirklich interessante Teil beginnt jedoch, wenn Sie Metadatenänderungen innerhalb der Transaktion unterstützen müssen. Einige RDBMSs unterstützen die Transaktionalität von DDL-Befehlen, d.h. Sie können diese Befehle zurücksetzen, wenn Sie die Transaktion zurücksetzen. Andere RDBMSs unterstützen DDL in Transaktionen nicht. DDL-Befehle in solchen RDBMSs beenden die aktuelle Transaktion implizit oder verursachen einen SQL-Server-Fehler.
Aber die beliebtesten RDBMSs befinden sich irgendwo in der Mitte: Sie unterstützen die Transaktionalität von DDL-Befehlen, jedoch nicht für alle Befehle. In der Regel können die globalsten Befehle, die zum Erstellen und Löschen von Dateisystemobjekten im Datenbankspeicher verwendet werden, keine Rücksetzprozedur unterstützen, sodass die Transaktionalität für kleinere Befehle unterstützt wird, deren Rücksetzung keine Änderungen in der Dateisystemstruktur verursacht. Transaktionen in allen RDBMSs sind nur im Allgemeinen ähnlich. Aber in der Praxis weist jede Datenbank eigene einzigartige Syntax für Transaktionssteuerbefehle auf und jedes RDBMS hat eigene einzigartige Transaktionssteuerungsmechanismen. Wir nennen dies ein Transaktionsmodell eines bestimmten RDBMS.
Für die korrekte Verarbeitung von Metadatenänderungen muss unser Programm in der Lage sein, DDL-Änderungen zurückzusetzen, die bei einem Transaktions-Rollback abgebrochen wurden. Es ist eine ziemlich komplexe algorithmische Aufgabe: Es erfordert die Unterstützung eines Metadaten-Deltas (Unterschieds), das den DDL-Änderungen innerhalb der aktuellen Transaktion jeder Verbindung zur Datenbank entspricht. Ein solches Delta existiert, bevor die Transaktion geschlossen wird und kann als ein Stück oder in Teilen zurückgesetzt werden (für diejenigen RDBMSs, die mehrstufige Transaktionen oder Savepoints unterstützen).
Nun lassen Sie uns einen Blick auf die Funktionen werfen, die die beliebtesten Datenbanken im Kontext von transaktionalem DDL bieten können.
Oracle-Datenbank
Oracle unterstützt kein transaktionales DDL: Die Transaktion wird als geschlossen betrachtet, wenn ein CREATE-, DROP-, RENAME- oder ALTER-Befehl ausgeführt wird. Wenn die Transaktion DML-Befehle enthält, geschieht das Commit der Transaktion als Ganzes und danach das Commit des DDL-Befehls als separate Transaktion.
PostgreSQL
PostgreSQL unterstützt transaktionales DDL: Alle DDL-Befehle mit Ausnahme von großkalibrigen Operationen, die auf das Erstellen und Löschen von Objekten wie DATABASE, TABLESPACE, CLUSTER abzielen. PostgreSQL unterstützt mehrstufige Transaktionen auf Savepoint-Ebene. Im Gegensatz zu standardisiertem SQL unterstützt PostgreSQL gleichnamige Savepoints. Das bedeutet, dass die älteren Punkte so lange nicht verfügbar sind, wie neuere existieren.
Wenn ein Fehler innerhalb einer Transaktion auftritt, setzt PostgreSQL die gesamte Transaktion zurück, verlangt jedoch in jedem Fall einen Befehl zum Abschluss der aktuellen Transaktion (COMMIT, ROLLBACK, ABORT). PostgreSQL startet zu Beginn einer Mehrfachanweisung eine implizite Transaktion und wandelt die Transaktion in eine explizite um, wenn sich innerhalb einer Mehrfachanweisung ein BEGIN-Befehl befindet (die Transaktion gilt als mit dem Beginn der Mehrfachanweisung begonnen).
MySQL
MySQL unterstützt kein transaktionales DDL. Keine Transaktionen sind für MyISAM verfügbar. Für InnoDB verursachen DDL-Befehle ein implizites Commit der aktuellen Transaktion.
MariaDB
MariaDB übernimmt sein Verhalten in Bezug auf transaktionales DDL von MySQL und unterstützt es nicht.
DB2
DB2 unterstützt mehrstufige Transaktionen sowohl auf der Ebene verschachtelter Transaktionen als auch auf der Ebene von Savepoints. Savepoints werden mit unabhängigen Namensräumen auf jeder Verschachtelungsebene bereitgestellt.
Microsoft SQL Server (MS SQL)
Die Unterstützung von mehrstufigen Transaktionen in MS SQL zeigt sich in der Unterstützung von Savepoints. In SQL Server dienen sogenannte verschachtelte Transaktionen nur als Zähler für BEGIN TRANSACTION-Aufrufe. Um eine Transaktion zu bestätigen, ist es notwendig, eine bestimmte Anzahl von COMMIT TRANSACTION aufzurufen, und der ROLLBACK-Befehl setzt die gesamte Transaktion unabhängig von der Verschachtelungsebene zurück. Das erste BEGIN TRANSACTION wird immer als der Beginn der Transaktion angesehen und ermöglicht gleichzeitig die vollständige Arbeit mit mehrstufigen Transaktionen über Savepoints. Savepoints können über die Befehle SAVE TRANSACTION und ROLLBACK TRANSACTION verwendet werden.
Teradata
Teradata unterstützt kein transaktionales DDL. DDL kann innerhalb einer Transaktion platziert werden, jedoch nicht mehr als ein Befehl pro Transaktion und nur als letzter Befehl in der Transaktion. Das Verhalten von Teradata ähnelt in dieser Hinsicht dem von Oracle. Somit kann ein DDL entweder mit der Ausführung der Transaktion ausgeführt oder überhaupt nicht mit dem Rollback der Transaktion ausgeführt werden. Das bedeutet, dass DDL-Änderungen, die für eine bestimmte Zeit existieren und dann zurückgesetzt werden können, nicht verfügbar sind.
Greenplum
Das Verhalten von Greenplum ähnelt dem von PostgreSQL.
Netezza
Netezza hat auch ursprünglich von PostgreSQL abgeleitet, aber vor langer Zeit. Und weist einige ernsthafte Unterschiede in Bezug auf die Unterstützung von Transaktionen auf. Netezza unterstützt DDL in Transaktionen ebenfalls, bietet jedoch keine Unterstützung für mehrstufige Transaktionen (Savepoints), und es ist unmöglich, eine Transaktion nicht ab dem Beginn der Mehrfachanweisung zu beginnen, wenn die Mehrfachanweisung bereits DDL-Befehle enthält.
Amazon Redshift
Ähnlich wie PostgreSQL.
Amazon Aurora
Ähnlich wie MySQL.
All das Wissen über die genannten Funktionen wurde in der DataSunrise Database Security Suite implementiert. Wir wissen immer, wie Ihr Datenbankschema aussieht und können es perfekt schützen.
DataSunrise unterstützt alle großen Datenbanken und Data Warehouses, einschließlich Oracle oder Exadata. Es unterstützt auch IBM DB2, IBM Netezza, MySQL, MariaDB, Greenplum, Amazon Aurora, Amazon Redshift, Microsoft SQL Server, Azure SQL, Teradata und mehr. Sie sind herzlich eingeladen, eine kostenlose Testversion herunterzuladen, wenn Sie sie in Ihren Räumlichkeiten installieren möchten. Falls Sie ein Cloud-Nutzer sind und Ihre Datenbank auf Amazon AWS oder Microsoft Azure betreiben, können Sie es aus dem AWS Market Place oder dem Azure Market Place beziehen.