Oracle 12c Release 1 ist verfügbar: Neue Features (nicht nur) für APEX-Entwickler
Oracle12c Release 1 steht
zum Download bereit. Darin ist out-of-the-box die Version APEX 4.2.0 enthalten.
Als ersten Einblick in die neue Datenbankversion haben wir im
Folgenden
eine kleine Auswahl interessanter Neuerungen speziell für Entwickler zusammengestellt. Bei
den Kollegen der DBA Community finden Sie entsprechend eine Übersicht mit den für Administratoren und den Datenbankbetrieb interessanten Neuerungen. Auch die Kollegen des APEX Development-Teams haben eine Informationsseite zum Thema APEX und Oracle12c zusammengestellt.
- Oracle Multitenant: Mehrere APEX-Versionen auf einem Datenbankserver
- 32K VARCHAR2 - überall
- Automatische Sequences und Identity Columns
- SQL und PL/SQL: Erweiterungen und Verbesserungen
- Verbessertes PL/SQL Error-Handling: Package UTL_CALL_STACK
- PL/SQL: Rechte, Rollen und mehr
- Daten "verstecken": Mit Data Redaction
- SQL Pattern Matching
- Blättern im SQL Ergebnis: LIMIT und OFFSET
- Tabellenspalten: Sichtbar und unsichtbar
- Wann ist die Zeile gültig: Valid Time Temporal
- Java in der Datenbank: Was ist neu?
- Zurück zur Community-Seite
Hinweis: Dieser Tipp enthält keinerlei Lizenzhinweise - er beschränkt sich auf die technische Funktionalität der neuen Features. Detaillierte Informationen zur Lizenzierung finden Sie in
Oracle Database Licensing Information 12c Release 1 (12.1).
Oracle Multitenant: Mehrere APEX-Versionen auf einem Datenbankserver
Eins der schon im Vorfeld meistdiskutierten Themas in Oracle12c ist Oracle Multitenant. Oracle Multitenant erlaubt es,
kurz gesagt, mehrere Oracle-Datenbanken ("Pluggable Databases ") in
einer Container-Datenbank zu betreiben. Man hat also die Betriebssystem-Prozesse und damit die
Oracle-Instanz nur einmal - diese "betreibt" dann jedoch mehrere, voneinander getrennte
Datenbanken (Abbildung 1).
Wenn Sie APEX in einer Oracle12c Multitenant Architektur nutzen, ist mindestens APEX 4.2 erforderlich -
ältere Versionen können nicht verwendet werden. Am besten nehmen Sie gleich
das aktuelle Patchset APEX 4.2.2.
Abbildung 1: Oracle Multitenant: APEX in der Pluggable Database installieren ...
Ist man an der Container Database angemeldet, so kann man -global- alle eingehängten
Pluggable Databases betrachten. In einer Pluggable Database selbst hat man den Eindruck
einer "normalen" Oracle-Datenbank. Die Inhalte einer anderen Pluggable Database sieht
man nicht. Demzufolge können künftig, innerhalb einer Container-Datenbank, mehrere
Pluggable Databases mit unterschiedlichen APEX-Versionen betrieben werden. Da eine neue
Pluggable Database sehr einfach als Klon einer existierenden erzeugt werden kann, ist das
Testen eines APEX-Upgrades mit dieser Architektur sehr viel einfacher.
Für APEX-Umgebungen bietet sich noch eine zweite Variante an: Wird APEX in der Container-Datenbank
installiert, so "scheint" die APEX-Engine in alle Pluggable Databases "durch". Die
APEX-Anwendungen in den Pluggable Databases selbst sind "privat" - und in anderen Pluggable Databases
nicht sichtbar. Die APEX-Engine dagegen ist nur einmal vorhanden. Ein APEX Upgrade oder Patching
wirkt daher sofort auf alle Pluggable Databases durch. Dieses Verfahren eignet sich sehr gut für
Umgebungen, in denen einzelne Projekte nicht nur APEX-Workspaces, sondern ganze Datenbanken für sich
bekommen. Auch hier können nun mehrere Projekte auf den gleichen Datenbankserver gelegt werden - für
das Projekt sieht alles genauso aus, wie vorher.
Abbildung 2: Oracle Multitenant: APEX in der Container Database installieren ...
Das "In-Place-Patchen" der in der 12c-Datenbank enthaltenen APEX Version ist derzeit (noch) nicht möglich; Sie können
aber die APEX-Version 4.2.2 aus dem OTN herunterladen, die in Oracle12c vorhandene APEX-Installation entfernen und APEX 4.2.2 neu installieren. Zu einem späteren Zeitpunkt wird es einen Patch geben, der nach Einspielen sowohl das "In-Place-Patchen" der APEX-Installation als auch die lokale Installation in eine Pluggable Database erlaubt. Mehr zum Thema finden Sie im Blog von Jason Straub.
Oracle Multitenant kann übrigens auch mit dem aktuellen SQL Developer bedient werden;
sobald Sie sich mit einer Oracle12c Container-Datenbank verbinden, taucht im Bereich
DBA der entsprechende Menüpunkt auf - hier können Sie nun neue Pluggable Databases erzeugen
oder bestehende verwalten.
Abbildung 3: Oracle Multitenant mit dem SQL Developer verwalten
Oracle Multitenant eröffner völlig neue Möglichkeiten für Setup und Betrieb von
APEX-Umgebungen - das Betreiben mehrerer Oracle-Instanzen ist nicht mehr unbedingt
nötig.
Weitere Informationen
Zurück zum Anfang des Artikels
32K VARCHAR2 - überall
Auf dieses Feature haben SQL- und PL/SQL Entwickler lange gewartet. VARCHAR2-Spalten einer
Tabelle können ab Oracle12c bis zu 32767 Bytes aufnehmen und verhalten sich damit genauso
wie in PL/SQL. Wenn man also abschätzen kann, dass die benötigte Länge unterhalb von 32Kb
bleibt, kann man sich den (komplizierteren) Einsatz von CLOBs sparen.
Ganz ohne den DBA geht es dann aber doch nicht: Damit das wirklich funktioniert, muss dieser
den Datenbankparameter MAX_STRING_SIZE auf
EXTENDED setzen und pro Datenbank einmal das
Skript $ORACLE_HOME/rdbms/admin/utl32k.sql laufen lassen
(ausführliche Information in der Oracle Database Reference: MAX_STRING_SIZE). In einer APEX Umgebung
sollte danach zusätzlich das Skript $APEX_HOME/core/collection_member_resize.sql gestartet werden, damit das neue Limit auch in APEX Collections genutzt werden kann.
Weitere Informationen
Zurück zum Anfang des Artikels
Automatische Sequences und Identity Columns
Der Umgang mit Sequences und das Generieren eindeutiger Werte wird im Oracle12c nochmals einfacher. So ist es nun
möglich, den "nächsten Wert" der Sequence als Default für eine Tabellenspalte
zu hinterlegen. Das bislang nötige und lästige Erstellen des Triggers gehört damit
der Vergangenheit an.
Es geht sogar noch einfacher: Mit der GENERATED AS IDENTITY-Klausel kann die Definition
der Sequence zu der der Tabelle genommen werden. Das explizite Erzeugen einer Sequence
fällt damit weg.
Die GENERATED ... AS IDENTITY Klausel kennt noch einige Variationen. Die dargestellte
Variante GENERATED ALWAYS nimmt immer den Wert der Sequence für die Tabellenspalte, auch
wenn im SQL INSERT explizit ein Wert vorgegeben wurde. Alternativ lässt sich ein
GENERATED BY DEFAULT oder BY DEFAULT ON NULL spezifizieren.
Weitere Informationen
Zurück zum Anfang des Artikels
SQL und PL/SQL: Erweiterungen und Verbesserungen
Im Bereich SQL und PL/SQL gibt es noch weitere Verbesserungen im Detail.
- Die WITH-Klausel einer SQL-Abfrage kann nun mit der Definition von Funktionen
versehen werden. Eine so definierte Funktion gilt dann nur für diese Abfrage.
Achtung: Wenn Sie das mit einem älteren SQL*Plus ausprobieren, setzen Sie vorher das
Kommando set sqlterminator off oder set sqlterminator # ab. Ansonsten denkt es, dass die SQL-Abfrage beim ersten PL/SQL Semikolon zu Ende ist. SQL*Plus 12.1 hat damit natürlich keine Probleme.
- PL/SQL-Funktionen, deren Parameter PL/SQL Datentypen erwarten (bspw. BOOLEAN), können nun aus SQL heraus aufgerufen werden ...
Die Rückgabe von PL/SQL-Datentypen nach SQL ist dagegen nach wie vor nicht
möglich.
- Mit der ACCESSIBLE BY-Klausel können Sie festlegen, dass ein PL/SQL-Package, -Prozedur
oder Funktion nur von einem (oder mehreren) anderen PL/SQL-Objekt(en) - und nicht direkt - aufgerufen werden kann. Das
ist besonders nützlich für "Helper-Packages", die nicht zum direkten Aufruf und
nur zur Nutzung durch andere Packages vorgesehen sind. Die neue Klausel verhindert
das versehentliche (oder absichtliche) Aufrufen und dadurch eventuell entstehende Seiteneffekte.
Weitere Informationen
Zurück zum Anfang des Artikels
Verbessertes PL/SQL Error-Handling: Package UTL_CALL_STACK
Wir jedes Datenbankrelease führt auch Oracle12c neue PL/SQL-Pakete ein. Für Entwicker
hochinteressant ist das neue Paket UTL_CALL_STACK , welches beim PL/SQL Exception Handling
wertvolle Dienste leisten kann. Mit UTL_CALL_STACK lassen sich eine Menge Details über
den aufgetretenen Fehler auslesen - das geht weit über die in Oracle11g vorhandenen Möglichkeiten
hinaus.
Weitere Informationen
Zurück zum Anfang des Artikels
PL/SQL: Rechte, Rollen und mehr
Im Bereich der Rechte, Rollen und deren Gültigkeit bei der Ausführung von PL/SQL
in Oracle12c einiges getan. In Oracle11g gelten hier folgende
Regeln.
-
PL/SQL-Objekte (Funktionen, Prozeduren) können mit den Rechten des aufrufenden
Nutzers (AUTHID CURRENT_USER) oder denen des
Eigentümers (AUTHID DEFINER) ablaufen.
Default ist AUTHID DEFINER.
-
Läuft ein PL/SQL-Objekt mit den Rechten des Eigentümers ab, so sind alle Rollen des
Eigentümers
abgeschaltet - es sind also nur direkt vergebene Privilegien aktiv. Läuft die
Prozedur dagegen mit den Rechten des aufrufenden Users, so sind dessen Rollen aktiv.
-
Wird eine PL/SQL-Funktion, die mit den Rechten des aufrufenden Users abläuft, in einer
View verwendet, so wird diese de-facto immer mit den Rechten des Eigentümers der View
aufgerufen, denn eine View läuft stets mit den Rechten des Eigentümers ab.
In Oracle12c können Rollen direkt an eine Prozedur vergeben werden. Voraussetzung ist,
dass der Eigentümer der Prozedur die Rolle ebenfalls hat und es um Standard-Datenbankrollen geht. Die
Rolle muss entweder von SYS oder vom Eigentümer an das PL/SQL Objekt vergeben werden.
Damit wird es möglich, PL/SQL-Code mit zusätzlichen Privilegien auszustatten, die der aufrufende
Nutzer normalerweise nicht hat. Ein Beispiel: Die folgende Funktion zählt alle Tabellen
in der Datenbank und gehört SYS. Da sie als AUTHID CURRENT_USER definiert ist, läuft sie stets mit
den Rechten des aufrufenden Nutzers ab - es besteht also keine Gefahr, dass ein unterprivilegierter
Nutzer sie missbrauchen kann.
Führt man diese Funktion nun als Nutzer ohne DBA-Privilegien (SCOTT) aus, so bekommt man dieses
Ergebnis. Das ist folgerichtig: SCOTT ist kein DBA, er kann die View DBA_TABLES demnach nicht sehen.
In Oracle11g wäre die einzige Möglichkeit gewesen, diese Prozedur mit den Rechten
des Eigentümers auszuführen (AUTHID DEFINER). Dann würde aber die komplette Funktion
mit allen Rechten von SYS ausgeführt - was mitunter nicht erwünscht ist.
In Oracle12c gibt es nun eine weitere Möglichkeit:
Die DBA-Rolle wird also nur an die Funktion vergeben. Ruft man diese nun wieder als
Nutzer ohne DBA-Privilegien (SCOTT) auf, so bekommt man dennoch ein Ergebnis.
Das direkte Abfragen von DBA_TABLES schlägt nach wie vor fehl ...
Wird dieser Funktionsaufruf nun in eine View gepackt, würde das
AUTHID CURRENT_USER wirkungslos werden. Angenommen, die View gehört dem
User SCOTT.
Die SELECT-Privilegien dieser View wurden wiederum öffentlich gemacht (GRANT ... TO PUBLIC). Und nun ist es egal, mit welchem User wir die View aufrufen, die Ausgabe ist stets die gleiche:
Es steht dort immer der User SCOTT, da die View stets mit den Privilegien des Eigentümers ausgeführt
wird - und diese Eigenschaft "schlägt" auf die PL/SQL-Funktion durch. Die AUTHID CURRENT_USER-Klausel
der PL/SQL-Funktion
ist faktisch wirkungslos geworden. Diese Lücke wird mit der BEQUEATH-Klausel, die nun
für eine View vergeben werden kann, geschlossen.
Nun wird die Identität des aufrufenden Nutzers quasi "durch die View" an die verwendete
PL/SQL-Funktion durchgereicht. Das Ergebnis hängt nun wieder vom aufrufenden User ab.
Weitere Informationen
Zurück zum Anfang des Artikels
Daten "maskieren": Data Redaction
Das neue Feature Data Redaction erlaubt es, Ergebnisse einer SQL-Abfrage nur für
die Ausgabe zu maskieren. Data Redaction ist von der Bedienung und Nutzung her recht ähnlich zur Virtual Private Database,
im Gegensatz zu dieser blendet Data Redaction die Daten jedoch nicht aus, sondern es
maskiert sie. Als Beispiel sollen die Inhalte der Spalte ENAME der Tabelle EMP
geschützt werden - und zwar, in dem die ersten drei Zeichen durch ein Sternchen
ersetzt werden. Das geht wie folgt:
In diesem Beispiel ist der Schutz immer aktiv (siehe Parameter expression) - das kann natürlich vom
angemeldeten User, dem Daten oder anderen Bedingungen abhängig gemacht werden. Selektiert man nun
die Tabelle EMP, so sieht das Ergebnis so aus:
Das interessante ist nun, dass die Tabellenspalte für WHERE-Klauseln
weiterhin normal funktioniert - es wird allein die Ausgabe maskiert.
Data Redaction ist also ein sehr einfach anwendbares Feature zum Schutz sensitiver Daten. An
der Anwendung muss man nichts ändern - nach Einspielen der Policy ist der Schutz sofort aktiv.
Allerdings sollte man vorher prüfen, ob die Anwendung nicht noch mehr mit den Daten tut, als
sie nur anzuzeigen - sprich: Es könnte sein, dass die Anwendung intern auf die Daten im Klartext
angewiesen ist - Data Redaction muss dann mit Umsicht eingesetzt werden.
Weitere Informationen
Zurück zum Anfang des Artikels
SQL Pattern Matching
Eine der interessantesten Neuerungen im Bereich der SQL-Funktionen ist das
SQL Pattern Matching. Dieser Satz an SQL-Funktionen erlaubt es Ihnen, Muster in
Tabellendaten zu finden - und hier kommt es vor allem auf Muster an, die sich
über mehrere Tabellenzeilen hinweg ergeben.
Ein Beispiel für solche Muster wären Web-Sessions, die durch Klicks in einer
Logdatei repräsentiert werden. Die Log-Datei enthält nur die einzelnen Klicks, etwa
wie folgt:
Wie man sehen kann, enthält die Logdatei nur "Einzelaufnahmen" - eben das
Abrufen einer Webseite (was auf einem Klick auf einen Link basieren mag). Eine
Web-Session wird durch mehrere Zeilen in dieser Tabelle repräsentiert -
explizit ist die Information nicht enthalten. Man muss die Sessions aus den Daten
rekonstruieren. Dass die CLIENT_IP in einer Session dieselbe sein muss, ist klar.
Das Ende der Session ist aber nicht direkt aus den Daten ableitbar -
es wird angenommen, dass die Session endet, wenn die Zeitspanne bis zum nächsten
Klick eine bestimmter Dauer (5 Minuten) übersteigt (natürlich vereinfacht dieses
Beispiel stark).
Die Zeilen, die zu einer Websession gehören, müssen also wie folgt gefunden
werden:
- Zunächst müssen die Daten nach CLIENT_IP und ZEITSTEMPEL sortiert werden
- Die allererste Zeile markiert den Beginn der ersten Session
- Wenn die nächste Zeile die gleiche CLIENT_IP enthält und die Differenz der Zeitstempel
nicht mehr als 5 Minuten beträgt, dann gehört die nächste Zeile zur gleichen Session, ansonsten
ist sie der Beginn der nächsten Session.
Man kann sich nun vorstellen, dass es nicht einfach ist, eine solche Aufgabe mit
Standard-SQL zu lösen. Das in Oracle12c neue SQL Pattern Matching macht die Aufgabe leicht - und ein Beispiel soll das demonstrieren:
Für das Beispiel braucht es eine Tabelle mit den Inhalten einer Logdatei. Wenn Sie (für APEX) den Apache Webserver mit mod_plsql verwenden,
können Sie dessen Logdatei access_log zum Ausprobieren hernehmen. Kopieren
Sie diese auf den Datenbankserver und erzeugen Sie eine externe Tabelle für die Datei wie
folgt.
Anschließend können Sie - mit einer SQL-Abfrage (!) nach Web-Sessions suchen ...
In guter alter SQL Manier wird der Datenbank nicht mehr gesagt, wie die Aufgabe
zu erledigen, sondern dass ein Pattern Matching erledigt werden soll. Die nötigen
Angaben erfolgen deklarativ - es wird festgelegt ...
- ... wie die Daten unterteilt werden sollen (PARTITION BY)
- ... wie die Daten sortiert werden sollen (ORDER BY)
- ... welche Berechnungen während des Pattern Matching erfolgen sollen (MEASURES)
- ... welche Zeilen zurückgegeben werden sollen (ONE ROW PER MATCH)
- ... wie das Pattern aussehen soll (START NXT+) und (hier:) welche Zeitspanne zwischen zwei Klicks liegen darf (DEFINE)
Als Ergebnis liefert diese SQL-Abfrage eine Übersicht über die gefundenen Sessions zurück.
Weitere Informationen
Zurück zum Anfang des Artikels
Blättern im SQL Ergebnis: LIMIT und OFFSET
Zwei neue SQL-Klauseln für Abfragen machen das Blättern in einem Bericht wesentlich
einfacher: Die LIMIT-Klausel sorgt dafür, dass nur eine bestimmte Anzahl Zeilen abgerufen
wird, die OFFSET-Klausel bewirkt, dass vorher eine bestimmte Anzahl geholt wird. Was man
bislang also aufwändig mit Subselects und ROWNUM gemacht hat, ist nun wesentlich einfacher
und klarer. Die folgende Abfrage selektiert demnach die Zeilen aus der Tabelle EMP
mit dem viert-, fünft- und sechsthöchstem Gehalt.
Das Abrufen einer bestimmten Teilmenge von Daten ist damit wesentlich leichter
als früher.
Weitere Informationen
Zurück zum Anfang des Artikels
Tabellenspalten: Sichtbar und unsichtbar
Tabellenspalten können in Oracle12c "unsichtbar" gemacht werden.
Die Tabellenspalten (hier: HIREDATE und COMM) sind tatsächlich nicht mehr sichtbar. Spricht
man sie dagegen explizit an, kann man normal damit arbeiten.
Weitere Informationen
Zurück zum Anfang des Artikels
Wann ist die Zeile gültig: Valid Time Temporal
Oracle12c beginnt mit der Einführung eines Valid Time Supports für Tabellenzeilen. Mit diesem
Feature kann eine Tabellenzeile mit einem Gültigkeitszeitraum versehen werden. Bei Abfragen
wird dann ein Zeitpunkt mitgegeben - und die Abfrage liefert nur die Zeilen zurück, die zu jenem
Zeitpunkt gültig waren.
Bitte beachten Sie, dass Valid Time Temporal (noch) nicht in einer Oracle Multitenant Architektur funktioniert;
Sie können es nur verwenden, wenn Sie die Datenbank "klassisch", also ohne Container- und Pluggable Datenbank
erzeugt haben.
Oracle fügt der Tabelle nun neue, unsichtbare Spalten hinzu.
Nun kann für jede Tabellenzeile die Gültigkeit gesetzt werden ... das folgenden Update-Kommando macht
alle Zeilen mit DEPTNO = 20 nur im Dezember 2012 gültig.
Mit einem Aufruf von DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME kann nun
der "Abfragezeitpunkt" gesetzt werden. Daraufhin werden die entsprechenden Zeilen
mit DEPTNO = 20 fehlen ...
Der "Abfragezeitstempel" kann natürlich auch wieder abgeschaltet werden.
Anstatt eine Tabellenzeile zu löschen oder zu verändern, kann man nun
die Gültigkeit in den Spalten VALID_TIME_START und VALID_TIME_END
setzen. Allerdings beherrscht die Datenbank (noch) nicht das Management eines
Temporal Primary Key: Sie müssen also beim Erstellen des
Primary Key Constraints die Tatsache berücksichtigen, dass es mehrere Zeilen mit der gleichen ID,
aber unterschiedlicher Gültigkeit geben kann. Zusammengesetzte Primärschlüssel können hier helfen.
Weitere Informationen
Zurück zum Anfang des Artikels
Java in der Datenbank: Was ist neu?
Wie die meisten Leser wissen, kann die Oracle-Datenbank nicht nur Stored Procedures und Functions
in PL/SQL, sondern auch in Java ausführen, denn seit der Version 8 ist eine Java-Engine Teil der
Datenbank. Das gilt für alle Datenbankeditionen ab der Standard-Edition (also nicht OracleXE). Und
zahlreiche Tipps der APEX Community basieren auf Java in der Datenbank.
In Oracle12c wurde die Java-Engine auf JavaSE6 aktualisiert. Erstmalig ist es auch möglich, selbstständig
ein Upgrade der Datenbank-JVM durchzuführen: Wer also JavaSE7 braucht, findet
in der Dokumentation (Java Developers' Guide) eine Anleitung dazu.
Mit dem Java6 hat die Datenbank die sicherlich auch "kuriose" Fähigkeit bekommen,
JavaScript-Code auszuführen - denn die Java-Engine kann das ab Version 6, also kann
es auch Oracle12c. Der folgende SQL-Code erzeugt die Funktion DO_JAVASCRIPT , welche
den übergebenen JavaScript-Code ausführt und das Ergebnis zurückgibt.
Nun können Sie JavaScript direkt am SQL-Prompt ausführen.
Weitere Informationen
Zurück zum Anfang des Artikels
|