Wenn große Datenmengen beispielsweise in eine Archivtabelle zu laden waren, so bot es sich vor PostgreSQL Version 9.3 an, nachträglich ein VACUUM FREEZE auf die Relation auszuführen, wenn sich die Datensätze im Anschluss garantiert nicht mehr änderten. Dies hatte den Vorteil, dass man sich einen späteren VACUUM FREEZE sparen konnte. Auf jeden Fall entfällt außerdem ein teurer zusätzlicher Scan der kompletten Tabelle im Anschluss, was gerade bei sehr großen Datenbeständen eine beachtliche Zeitersparnis ist.
In PostgreSQL 9.3 gibt es nun die Möglichkeit, das sofort beim Ladens der Daten erledigen. Das Kommando
»COPY
«
wurde um den Parameter
»FREEZE
«
erweitert.
»COPY
«
mit
»FREEZE
«
erfordert einige Rahmenbedingungen. So muss die Zieltabelle in derselben Transaktion erzeugt worden sein, die auch den COPY-Befehl absetzt. Auch dürfen keine
»CURSOR
«
auf diese Tabelle geöffnet sein. Das folgende Beispiel zeigt die Verwendung von
»COPY FREEZE
«
mit einer CSV-Datei:
BEGIN; CREATE TABLE t3(LIKE t2); COPY archive_tbl FROM '/Users/bernd/tmp/archive.dat' FREEZE CSV; COMMIT;
Häufiger regten Anwendern die Verfügbarkeit von Triggern beim Ausführen bestimmter DDL-Kommandos an. Solche Trigger können beispielsweise Änderungen an der Datenbank selbst verfolgen. Ein Anwendungsbeispiel sind etwa Replikationssysteme wie Slony-I, die auf eine entsprechende Benachrichtigung über veränderte Objekte angewiesen sind.
Einen Event Trigger erzeugt man über das Kommando
»CREATE EVENT TRIGGER
«
. Die Syntax folgt der normalen
»CREATE TRIGGER
«
-Syntax, das heißt, die Trigger-Funktion ist im Vorfeld zu definieren.
Listing 5
zeigt ein Beispiel, das pauschal alle
»ALTER TABLE
«
-Kommandos in einer Datenbank mit einem Fehler verhindert:
Listing 5
Event Trigger
Neben dem Event-Trigger-Ereignis
»ddl_command_start
«
stehen noch die Ereignisse
»ddl_command_end
«
und
»sql_drop
«
zur Verfügung.
»ddl_command_start
«
wird vor dem Ausführen des jeweiligen DDL-Kommandos ausgeführt,
»ddl_command_end
«
entsprechend bevor das DDL-Kommando beendet wird. Event Trigger mit dem
»sql_drop
«
-Ereignis werden noch vor
»ddl_command_end
«
-Event-Triggern ausgeführt: Für alle Objekte, die innerhalb dieses Ereignisses entfernt werden.
Event Trigger lassen sich im Moment in PL/pgSQL oder C implementieren. Ein CREATE-EVENT-TRIGGER-Kommando selbst kann nicht Auslöser eines Event Triggers sein.