Network Encryption in Oracle

Today I want to share with you one of my security projects which Iwas working on at DBConcepts GmbH.

One of the topics was the encryption of Oracle’s Network Traffic.

The purpose of a secure cryptosystem is to convert plaintext data into unintelligible ciphertext based on a key, in such a way that it is very hard (computationally infeasible) to convert ciphertext back into its corresponding plaintext without knowledge of the correct key.

The setup is as followed:

A high availablity setup using dataguard with a primary and standby database 19c EE Edition. Enterprise Manager Cloud Control 13c, a recovery catalog database and a application server corresponding to each database server are also in the IT Infrastructure and to be secured.

The task is as follows:

  • the secure communication between the application server to the database server
  • the encryption of Dataguard logshipping from the primary to the standby database
  • the encryption of network traffic from the database hosts to the recovery catalog
  • the encryption of JDBC-thin clients connecting to the database

I want to give you a quick overview about the possibilities which oracle offers and how unsecure a not encrypted communication is.

First, there are two encryption options which oracle provides:

  • Oracle’s Native Network Encryption (using TCP Port 1521)
  • TLS/SSL Encryption Standard (using custom TCPS Port f.e. 1522)

Oracle Database 19c supports the usage of a combination of those encryption options.

Let’s get into action:

I did a tcpdump from our monitoring host where an oracle client is installed to connect to a 19c database. It sends select statements to gather information for specific metrics.The tcpdump listens to all outgoing connections with the target database specified as the destination.

(Due to privacy policies hostnames and ip adresses are changed)

The result without a secure communication, which is the default setup for all database installations:

[root@<monitoring01> ~]# tcpdump -i eth0 dst <target db ip adress> -A -v

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes




…

<start of packet>

11:12:34.455642 IP (tos 0x0, ttl 64, id 62432, offset 0, flags [DF], proto TCP (6), length 1161)

    <monitoring01>.30585 > <target db ip adress>.ncube-lm: Flags [P.], cksum 0x5599 (incorrect -> 0xf31b), seq 1684:2793, ack 2135, win 501, options [nop,nop,TS val 3707091369 ecr 1327380418], length 1109

E.....@.@..p

3.



zjfwy... /9.&......U......

................................................................................................................................................@select replace(WAIT_CLASS,'/','') WAIT_CLASS,ROUND(FG,2) FG,ROUN@D(BG,2) FG_AND_BG,DBTIME,to_char(end_time,'yyyy-mm-dd hh24:mi:ss@') end_time from (

select sw.wait_class,wc.END_TIME, wc.WAIT_CLA@SS#, (wc.TIME_WAITED_FG)/(wc.INTSIZE_CSEC/1) fg, (wc.TIME_WAITED@)/(wc.INTSIZE_CSEC/1) bg, 0 dbtime

from V$WAITCLASSMETRIC WC,V$@SYSTEM_WAIT_CLASS SW

where WC.WAIT_CLASS#=SW.WAIT_CLASS#

and wai@t_class!='Idle'

union

select 'CPU',FG.END_TIME, -1, FG.value/100@, BG.value/100, DBTIME.value from V$SYSMETRIC FG, V$SYSMETRIC BG@, V$SYSMETRIC DBTIME

where BG.METRIC_NAME = 'Background CPU Usag@e Per Sec'

and BG.GROUP_ID = 2

and FG.METRIC_NAME = 'CPU Usage P@er Sec'

and FG.GROUP_ID = 2

and DBTIME.METRIC_NAME = 'Average Ac@tive Sessions'

and DBTIME.GROUP_ID = 2

and BG.END_TIME = FG.END_3TIME

and FG.END_TIME = DBTIME.END_TIME

order by 1)

.....................................................

<End of packet>

11:12:34.509827 IP (tos 0x0, ttl 64, id 62433, offset 0, flags [DF], proto TCP (6), length 52)

…v

As you see this is pretty scary. Every SQL-Statement and every response from the database is sent over the network in plaintext. In terms of privary and security Data modification attacks and replay attacks are possible.

Examples:

  • Intercepting a $100 bank deposit, changing the amount to $10,000, and retransmitting the higher amount is a data modification attack.
  • Repetitively retransmitting an entire set of valid data is a replay attack, such as intercepting a $100 bank withdrawal and retransmitting it ten times, thereby receiving $1,000.

This is were encryption comes to place to secure your company and enviroment against unauthorized parties intercepting data in transit.

After the implementation of security and encryption, this is the final result:

There is no plain text send over the network, only ciphertext !

[root@<monitoring01> ~]# tcpdump -i eth0 dst <target db ip adress> -A -v

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes



<start of packet>

11:23:46.582209 IP (tos 0x0, ttl 64, id 3746, offset 0, flags [DF], proto TCP (6), length 696)

<monitoring01>.59236 > <target db ip adress>.ssh: Flags [P.], cksum 0x53c8 (incorrect -> 0xb685), seq 1633:2277, ack 3158, win 130, options [nop,nop,TS val 3707763496 ecr 1328052548], length 644

E.....@.@...

3.



zjf.d..............S......

...(O(yD...U

J3R.Ok.J._.W/....ZpZ

*.:/..d.#.......Bl.&.Z5a.3.....B.....m.S....U..NtS.......y..x......*>.b....$...^ij........Z6..KPK......~v\.WvHm.6.$&9.%;.x..x#a.:..5.... .X=[M...?......xv3i&(.|.-+.p.~.n...i.J.wW...qS"d....Z...........eY1.L..V..F5..(..E.O...'.os.

Y.xIG8......K....5rh.F@..D=..~............].U.Fi..7.u......e..y/..C'..... |...{o_..6b>`..}.X.f...H..K=`v.>

.....i.....B ..d*os.h&.....:....W.G....C.s...2.V..HWA(o..e ....$x.....|. ....Kwz.....:p.Nz.Aqz..5..+V+dtria..lv7T..k.n..5E.....



<end of packet>

11:23:46.582899

…v

Hardening the systems and implementing security features is a must !

 

to be continued …

Wie Sie sich vor Hackerangriffen schützen können | Unsere 3 Tipps

Die Schlagzeilen von Hackerangriffen brechen nicht ab. Allein 2022 zierten diverse Cyberattacken von Unternehmen die heimischen Schlagzeilen. Ein Beispiel: Die im November gehackte Webseite von Hofer Reisen, ein Teil der Verkehrsbüro-Gruppe zu der unter anderem die Austria Trend Hotels, Ruefa-Reisebüros, sowie in Kitzbühel ansässige Eurotours gehören, wurde in diversen Tageszeitungen (Krone, Kurier, etc.) erwähnt.

Auch das oberösterreichische Unternehmen Rotax war im August 2022, aufgrund einer großangelegten Cyberattacke auf den Mutterkonzern Bombardier Recretional Product (BRP) in Kanada gezwungen Teile der Produktion auszusetzen. BRP bestätigte, dass eine Schadsoftware eingeschleust wurde.

Der wohl weit überwiegende Teil von Hackerangriffen erfolgt durch Phishing und Social Engineering Attacken. Laut einer Umfrage von Statista wurden 2022 mehr als 50 Prozent aller befragten österreichischen Unternehmen mit Pishing Emails attackiert.

Die Cyberkriminellen machen auch vor Krankenhäuser nicht halt: Im Dezember 2022 wurde ein Kinderkrankenhaus in Kanada gehackt und erpresst. (Spiegel, 01.01.2023). Nicht zu vergessen sind die massiv zerstörerischen Cyberattacken auf die ukrainische Regierungs-Technologie sowie den Finanzsektor.

Dass Hackerangriffe Unternehmen in den Ruin treiben können, zeigt der Angriff auf den deutschen Fahrradhersteller mit den Marken Prophete, VSF Fahrradmanufaktur, Rabeneick und Kreidler, der das Unternehmen letztlich sogar in die Insolvenz trieb. Die Ransomware-Attacke legte das Unternehmen Ende November 2022 bis zu fast vier Wochen lang still und verpasste, dem bereits angeschlagenen Unternehmen, den finalen Stoß.

Im recht frischen neuen Jahr geht es gleich schlecht weiter: Die Britische Post kämpft nach einem Hackerangriff mit massiven Problemen bei der Auslieferung ins Ausland (Spiegel 13.01.2023). Zeitgleich wird in Österreich die Uni Innsbruck Opfer eines Cyberangriffs, der glücklicherweise erfolgreich abgewehrt wurde.

Die oben genannten Beispiele sind nur zwei von den bereits 31 im Jänner erfolgten Angriffen auf unterschiedliche Branchen weltweit. Gartner prognostiziert, dass bis 2025, 45 Prozent der Unternehmen weltweit Angriffe auf ihre Softwarelieferketten erlebt haben werden (das ist eine Verdreifachung gegenüber 2021).

Die sich vergrößernden Angriffsflächen gehörten laut der Sicherheits- und Risikotrendanalyse von Gartner zu den sieben Trends im Jahr 2022. Diese Angriffsflächen (Remote Arbeiten in Kombination mit verstärkter Nutzung der Public Cloud sowie hochgradig vernetzte Lieferketten und die Verwendung von cyber-physischen Systemen), die immer komplexer und anspruchsvoller werden, bedürfen einen erweiterten Ansatz bei der Sicherheitsüberwachung.

Zeitgleich aber agieren die Cyberkriminellen immer ausgeklügelter und raffinierter. Während die IT-Hardware / Software über die vergangenen Jahre immer sicherer wird, sind die Sicherheitsstandards von IoT und OT-Geräte bei weitem nicht auf demselben Niveau. Genau diesen Schwachpunkt nutzen die Hacker aus, um sich Zugang zu den Netzwerken zu verschaffen mit dem Ziel den Unternehmensbetrieb zu stören.

Investitionen in Cybersicherheit können schwerwiegende IT -Sicherheitsvorfälle verhindern

Gleich vorweg die schlechte Nachricht: Es gibt leider keinen 100-prozentigen Schutz. Im Wesentlichen geht es darum gut vorbereitet zu sein (Business Recovery Plan), Wahrscheinlichkeiten für einen Angriff (Security Hygiene), sowie die Auswirkungen bei einem Angriff zu minimieren (Backup). Sowie die Wiederherstellungszeit (Restore) nach einem Angriff zu verkürzen, um so schnell wie möglich wieder „up and running“ zu sein.

 

Unsere drei Tipps für Cybersicherheit für Unternehmen a.k.a  your line of defense

 

  1. Business Recovery Plan

Generell sind Unternehmen gut beraten, wenn sie über einen Wiederherstellungsplan verfügen. Naturkatastrophen, Cyberattacken oder wirtschaftliche Ausfälle, können unerwartete Bedrohungen darstellen. Allerdings wollen wir uns in diesem Blogbeitrag nicht mit allen Aspekten des allgemeinen Plans beschäftigen, sondern lediglich hervorstreichen, dass geschäftskritische Prozesse im Vorfeld definiert werden sollten. Mit dieser Vorgehensweise erhält man einen guten Überblick über die Dauer der Wiederherstellung im Fall der Fälle. Wir empfehlen sich folgende Fragen zu stellen:

  • Existieren aktuelle Backups?
  • Ist eine Backup Recovery Umgebung vorhanden?
  • Ist das Unternehmen in der Lage, die wichtigsten Applikationen wiederherzustellen? Welche sind die wichtigsten Applikationen? Was ist die Priorität? In welcher Reihenfolge müssen sie wieder laufen? Gibt es Zugang zu den Applikationen bzw. wie kommen wir an diese heran?

Unser Tipp: Erstellen Sie eine Checkliste damit Sie wissen was in welcher Reihenfolge zu tun ist. Definieren Sie die

  • Reihenfolge und die Priorität der Applikationen
  • Stellen sie Backups sicher und schaffen Sie ein Umfeld zur schnellen Wiederherstellung, denn die wichtigste Applikation sollte so schnell wie möglich „up & running“ sein.

Überlegen Sie sich auch für den Zweifelsfall, was es tatsächlich bedeuten würde, bei einer Ransomware Attacke den Lösungsgeldforderungen nachzukommen. Denn Statistiken zeigen, dass nur 8 Prozent der Unternehmen, die das Lösegeld bezahlt haben, vollständig ihre Daten wiederherstellen konnten. Im Durchschnitt gelang nur der Hälfte der Unternehmen ihre Daten wiederherzustellen. Und es gibt auch keine Garantie, dass nach Bezahlung alles sofort wieder „up & running“ ist.

  1. Security Hygiene:
  • Netzwerksegmentierung
  • Gut gepflegte Systeme
  • Patching
  • Korrekte Konfigurationen
  • Vollständige, aktuelle und überprüfte Software-Backups
  • Starke Administrator Passworte (Aus dem „Digital Defense Report“ von Microsoft geht unter anderem hervor, dass Angriffe auf Passwörter mit 921 Angriffen/Sekunde um 74 Prozent gegenüber dem Vorjahr gestiegen sind)
  • Geschulte Mitarbeiter:innen
  • Regelmäßige Fire-drills
  • Benutzung von den richtigen Sicherheitstools
  • Konsequentes und kontinuierliches Monitoring dieser Tools (24/7×365)
  1. Backup & Recovery

Wie bereits im vorherigen Punkt erwähnt, ist der Einsatz von den Sicherheitstools der essenzieller Erfolgsfaktor bei der Verteidigung gegen die Cyberkriminellen. Wir empfehlen als umfangreiche Backup– und Recovery Lösung, je nach Anforderung Commvault Metallic und Commvault Complete. Unsere Erfahrung zeigt, dass die kontinuierliche Sicherheit der Daten, Geräte und Netzwerke für den Unternehmenserfolg wichtiger denn ist.

Warum Commvault?

Erstens verringern Sie mit den Lösungen von Commvault im Bereich Ransomware das Risiko von Cyberangriffen und erhöhen die Sicherheit Ihrer Daten. Zweitens sind die Lösungen im Gegensatz zu „Punktprodukten“, die die Komplexität und die Kosten erhöhen, nur eine einzige leistungsstarke Backup-Softwarelösung. Und Drittens, ist sie eine Sicherungs- und Wiederherstellungslösung, die definitiv mit den wechselnden Anforderungen Ihrer Daten mithalten kann. Weitere gute Gründe für die Commvault Lösungen:

  • Datensicherung in der Cloud. Über 80 Prozent der Unternehmen nutzen heute mehrere Da die Commvault Unterstützung für mehr als 40 Cloud-Speicheroptionen in öffentlichen und privaten Clouds bietet, hat man die Flexibilität eine hybrid Cloud-Umgebung zu erstellen.
  • Virtuelle Maschinen. Die Virtualisierung bietet eine leistungsstarke und flexible Möglichkeit zur Bewältigung der explosionsartigen Zunahme von Daten und Anwendungen. Das Erstellen und Bereitstellen von virtuellen Servern, Speicher und Anwendungen in privaten und öffentlichen Clouds bringt jedoch eigene Herausforderungen mit sich. Mit Commvault können VMs in der gesamten Umgebung gesichert, wiederhergestellt und verwaltet werden. Egal wo sie sich befinden. Wildwuchs á la eigenständigen Einzelprodukte, Datensilos, redundante Infrastruktur sind damit Geschichte.
  • Anwendungen und Datenbanken. Gerade bei einer Vielzahl von Datenbanken und Anwendungen unterschiedlicher Generationen möchte man vermeiden, dass diese von mehreren unterschiedlichen Produkten geschützt werden. Die Servicepalette von Commvault ist im Vergleich aufgrund ihrer Tiefe und Breite einfach unübertroffen: Man kann Workloads in die Cloud migrieren, Datenbanken effizient sichern und den Zugriff auf Daten beschleunigen.
  • Endgeräte. Der Schutz von Datenbanken und Unternehmensanwendungen ist wichtig, aber was ist mit den Endgeräten? Fast die Hälfte der Daten, einschließlich wichtiger Kundeninformationen und geistigem Eigentum, befindet sich auf Desktops, Laptops und mobilen Geräten. Viele dieser Geräte sind häufig das Ziel von Cyberangriffen wie Ransomware, weshalb ihr Schutz ein Muss ist. Commault complete data protection ist genau hierfür gedacht: Einmal auf den Endgeräten installiert, können User:innen ihre Dateien selbst wiederherstellen. Et voilà.
  • Wiederherstellung im Katastrophenfall. Bedenken Sie, dass nicht alle Daten gleich sind: Sie müssen die Wiederherstellungsanforderungen und -kosten gegen die für das Unternehmen geltenden Service Level Agreements abwägen. Und während die Wiederherstellungszeiträume an die Wichtigkeit der Daten gebunden sein sollten, brauchen Sie gleichzeitig eine einzige Lösung, um die Komplexität zu reduzieren. Die Lösung von Commvault ist nicht nur benutzerfreundlich und einfach – die Wiederherstellung der Daten ist auch ortsungebunden.

Weitere gute Gründe für Commvault:

Umfangreiche Abdeckung der Arbeitslast – Einheitliches Kundenerlebnis -„All-in-one“ (Null Abhängigkeit von zusätzlichen oder 3rd Party Tools oder Infrastruktur von Drittanbietern) –Einfacher und sicherer/Air-Gap – Aktive Überwachung (Frühwarnung vor Bedrohungen direkt auf dem Client mit branchenweit einzigartigen Honeypots) –Zero-Trust-Sicherheit -Automatisierte Vorgänge (Schnelle Isolierung verdächtiger Dateien und Clients zur Begrenzung potenzieller Angriffsflächen und Auswirkungen.) –Flexible rapid recovery. – Vermeidung erneuter Infektionen (Chirurgisches Löschen verdächtiger und bösartiger Dateien aus der Umgebung und aus den Sicherungskopien).

Recovery:

Wie schon erwähnt, kann die Wiederherstellungszeit (Restore) über die Unternehmensexistenz entscheiden. Um diesem Thema mehr Raum zu geben und um mit Expert:innen über die Möglichkeiten zu diskutieren, haben wir im Rahmen unserer Reihe DB Insider im Mai 2023 gemeinsam mit Pure Storage und Commvault ein Event geplant. Beim Grillen wollen wir uns im informellen Rahmen über das Thema auszutauschen. Falls sie sich für das Thema interessieren, sind Sie hiermit eingeladen. Regelmäßige Updates sowie die Anmeldung zum Event finden Sie auf unserer Homepage (www.dbconcepts.com).

 

Quellen:

bericht_cybersicherheit_2021.pdf
Microsoft Digital Defense Report 2022 Executive Summary
Cyberangriff auf 34 Firmen in Oberösterreich | kurier.at
Österreich – Arten von Cyberangriffen auf Unternehmen 2022 | Statista
Hackerangriffe aktuell heute 2022/2023 – eine Übersicht | KonBriefing.com
Ransomware: Erpresser entschuldigen sich bei Kinderkrankenhaus in Kanada -DER SPIEGEL
Cyber-Angriff auf Rotax: Die Auswirkungen | FACTORY (factorynet.at)
Motorenhersteller Rotax setzt wegen Cyberattacke Produktion aus (futurezone.at)
Mark Harris | Sr Director Analyst, Podcast/Think Cast, 31.08.21
Business Recovery Plans — ENISA (europa.eu)

Oracle SQL MATCH_RECOGNIZE

Ein sehr mächtiges und effizientes Konstrukt gibt es seit der Oracle Version 12C: MATCH_RECOGNIZE. Vereinfacht gesagt lassen sich mit MATCH_RECOGNIZE regular expressions auf Zeilen anwenden, um so bestimmte Muster zu erkennen. Beispielsweise lassen sich somit in der Finanzwelt bestimmte Aktienkurs-Verläufe erkennen. Dieser Blogbeitrag soll dazu dienen, sich diesem Thema anhand einfacher und fiktiver Beispiele langsam anzunähern.
Grundlegender Aufbau:

 

 

PATTERN_PARTITION_CLAUSE

Diese ist optional. Hier kann man die Daten sortieren (ORDER BY) und in Gruppen aufteilen (PARTITION BY). Um bei jeder Ausführung der Query konsistente Ergebnisse zu erhalten, sollte zumindest ein ORDER BY eingebaut werden.

PATTERN_MEASURES_CLAUSE

Dieser Abschnitt definiert die Spalten, welche im SELECT Teil ausgegeben werden. Es gibt einige inbuilt functions, welche hier verwendet werden können. Dazu später mehr.

PATTERN_DEF_DUR_CLAUSE

Hier wird die eigentliche magic definiert. In diesem Abschnitt werden die patterns definiert, welche über jede Zeile ausgeführt werden. Gibt es ein match, sprich wird genau dieses Muster identifiziert, wird die Zeile ausgegeben.

 

Wir schauen uns anhand einiger Beispiele die einzelnen Abschnitte näher an. Zu diesem Zwecke habe ich eine Tabelle mit Aktiendaten erstellt, welche wie folgt definiert ist (Das Skript kann am Ende des Artikels heruntergeladen werden):

 

 

 

 

 

 

Die Tabelle beinhaltet Aktienkurse eines fiktiven Unternehmens. Wir starten mit einer simplen Abfrage, anhand welcher ich auf die Struktur näher eingehen möchte: Alle Handelstage, an denen es einen oder mehrere Handelstage gibt, welche einen Startkurs größer als 17 haben:

 

 

 

 

 

 

 

 

 

Nachfolgend eine Erklärung der einzelnen Codeteile:

PARTITION BY: Unterteilt die Daten je nach Titel in einzelne Gruppen. In unserem Fall haben wir nur einen Titel in unseren Testdaten, wodurch es sowieso nur eine Gruppe gibt, nämlich die der „Datenbank AG“.

ORDER BY: Sortiert die Daten in der jeweiligen Gruppe je nach Handelstag aufsteigend.

MEASURES: Definiert, welche Spalten im result set zusätzlich ausgegeben werden. Hier sehen zwei inbuilt functions: CLASSIFIER() und MATCH_NUMBER(). CLASSIFIER () gibt an, welche pattern variable für diese Zeile gematched hat. MATCH_NUMBER () vergibt für gematchte Gruppe eine eigene Nummer, welche bei 1 startet und sich für jede neue Gruppe um 1 erhöht.

ALL ROWS PER MATCH: Definiert, dass bei aufeinanderfolgenden matches jede Zeile ausgegeben wird. Das pendant dazu wäre ONE ROW PER MATCH, welches auch der Default Wert ist. Hier wird dann nur die erste Zeile der jeweiligen Gruppe ausgegeben. In unserem Beispiel sehen wir, dass für Gruppe 4 jede einzelne Zeile ausgegeben wird; würden wir stattdessen ONE ROW PER MATCH verwenden, würden wir für Gruppe 4 nur die erste Zeile sehen. Das Ganze hat dann auch Auswirkungen auf die oberen drei Bereiche: Bei ALL ROWS PER MATCH, so wie wir es verwenden, könnte ich den den PARTITION BY, ORDER BY und MEASURES Bereich ganz weglassen, da sowieso alle Spalten im result set ausgegeben werden. Verwende ich hingegen ONE ROW PER MATCH, muss ich entweder Spalten im MEASURES Bereich angeben und/oder die ORDER BY / PARTITION BY Klausel angeben. Das Prinzip ist dem GROUP BY also sehr ähnlich.

PATTERN: Hier liste ich die einzelnen Variablen auf, welche im DEFINE Bereich definiert sind und auf die jeweilige Zeile zutreffen müssen. In unserem Beispiel ist das die Variable „start_1“ mit einem regular expression chracter „+“. Dies bedeutet, dass es einen oder mehrere Handelstage geben muss, an denen der Startkurs höher als 17 ist.

DEFINE: Hier werden die Variablen mit ihren conditions definiert, welche im PATTERN Bereich verwendet werden können.

 

 

 

 

 

 

 

Wie können wir das Ergebnis interpretieren?

Auf die Handelstage 01.12.2022, 03.12.2022 und 09.12.2022 folgen jeweils Tage, an denen der Startkurs kleiner als 17 ist. Der 13.12. ist der erste Tag einer Reihe von Handelstagen, wo der Startkurs höher als 17 ist.

Im nächsten Beispiel wollen wir alle Handelstage ausgeben, an denen exakt zwei Mal in Folge der Startkurs höher ist als der Schlusskurs am Vortag.

 

 

 

 

 

 

 

Hier sehen wir, dass das SQL im Prinzip ähnlich aufgebaut ist als im Beispiel eins. Im DEFINE Bereich ist unsere pattern Variable mit der dazugehörigen condition definiert. Diese besagt, dass der Startkurs der jeweiligen Zeile höher sein muss als der Schlusskurs der darüberliegenden Zeile. Hierzu verwende ich die Funktion PREV(), welche dann genau auf die darüberliegende Zeile verweist. An diesem Beispiel sehen wir auch, dass es Sinn macht, die Daten zu sortieren, da wir nicht immer wissen, in welcher Reihenfolge die Daten aus der Datenbank abgefragt werden (das Ergebnis ist also nicht deterministisch). Im PATTERN Bereich holen wir uns die Variable und wandeln diese nun mit „{2}“ zu einem regulären Ausdruck um. Dies bedeutet, dass wir zwei Handelstage in Folge haben wollen, auf welche die condition zutrifft. Zur Kontrolle definieren wir im MEASURES Bereich die Spalte „schlusskurs_vortag“. Da MATCH_RECOGNIZE wie eine INLINE VIEW zuerst ausgeführt wird, können wir diese im SELECT Teil verwenden und ausgeben.

 

 

 

 

 

Wie können wir das Ergebnis interpretieren?

Wir sehen nun immer zwei Handelstage in Folge, an denen der Startkurs höher ist als der Schlusskurs am Vortag.

Für das nächste Beispiel überlegen wir uns folgendes Muster: An Handelstag eins soll der Startkurs zwischen 16 und 17 sein, an Handelstag zwei soll der Startkurs größer als 17 sein, an Handelstag drei soll der Startkurs wieder zwischen 16 und 17 sein.

 

 

 

 

 

 

 

 

Dieses SQL enthält eine Erweiterung, nämlich AFTER MATCH SKIP TO LAST. Diese Syntax bedeutet, dass wenn es ein match gibt, die Suche nach einem neuen Match bei der letzten pattern Variable beginnt.

 

 

 

 

 

Wie können wir das Ergebnis interpretieren?

Wir sehen nun alle Handelstage, die genau unserem Muster entsprechen. Würden wir AFTER MATCH SKIP TO LAST weglassen, würden nur die ersten drei Handelstage im result set erscheinen, da die Suche erst am 22.12.2022 weitergehen würde.

In unserem letzten Beispiel wollen wir eine typische V-Formation erkennen. Dies bedeutet, dass der Aktienkurs zunächst einbricht und sich nach Erreichen der Talsohle wieder erholt.

 

 

 

 

 

 

 

 

 

 

 

 

Hier haben wir im DEFINE Bereich drei pattern Variablen definiert, wobei man die Definition der ersten Variable „strt“ auch weglassen könnte, da sie sowieso jede Zeile matched. Diese dient für uns lediglich als Einstiegspunkt in unsere Mustersuche.

 

 

 

 

 

 

 

Wie können wir das Ergebnis interpretieren?

Wir sehen in unserem result set anhand der Gruppennummer, welche Handelstage eine V-Formation bilden und somit zu einer Gruppe gehören. Das Ende der jeweiligen V-Formation ist zugelich der Beginn einer neuen Kursbewegung nach unten.

Wir haben uns nun anhand einiger Beispiel angesehen, was MATCH_RECOGNIZE ist und was für Abfragen wir damit durchführen können.

 

 

Oracle Database 19c SIG

Underestimated Powertools – Yes we can!

They have a nimbus of substitute solutions: Partition View , DBMS_PARALLE_EXECUTE , and Snapper. They are used, for example, in the Standard Edition, or when the Oracle options are not available. The exact application of the tools is sometimes poorly documented. The nimbus does not do these tools justice. Each of these can do things that the official option cannot. In this lecture you will not only learn how to really use these tools in practice, but you will also learn about their hidden strengths.

Check out the video here:

and the slides here

TOO_MANY_ROWS Exception

TOO_MANY_ROWS Exception

Wird in einem PL/SQL Block das Ergebnis einer Select Abfrage mittels INTO in eine Variable geschrieben, so muss das Statement EXAKT 1 Zeile zurück liefern. Wird keine Zeile zurückgegeben, so wird eine NO_DATA_FOUND Exception ausgelöst. Ist die Where-Klausel nicht exakt genug und es werden mehrere Zeilen zurück geliefert, so wird eine TOO_MANY_ROWS Exception ausgelöst. Der Unterschied zwischen diesen beiden Fehlern ist jedoch ein potentiell sehr relevanter:

Tritt der Fall einer NO_DATA_FOUND Exception auf, so bleibt der Wert der Variable unverändert – sprich wenn die Variable NULL ist, denn bleibt der Wert NULL, ist der Wert beispielsweise 2, so bleibt er 2 (siehe auch die Ergebnisse des Beispielskriptes).

Tritt der Fall einer TOO_MANY_ROWS Exception auf, so ändert sich der Wert der Variable – und zwar auf eventuell unvorhersehbare Weise. Der Wert der Variable wird auf den ersten gefundenen Wert der Abfrage gesetzt. Mit Order By kann das kontrolliert werden, aber ohne ist es nicht vorhersehbar, welcher Wert eingetragen wird.

Das wirklich wichtige an diesem Verhalten ist, dass bei einem größeren Block mit nachfolgenden Schritten berücksichtigt werden muss, dass bei einem TOO_MANY_ROWS Fehler die Variable einen Wert hat trotz der Exception.

Das folgende Skript verdeutlich diese Möglichkeiten:

declare
  v_value number := 2;
begin
  -- create no data found exception - v_value is NULL
  dbms_output.put_line('v_value am Ende = ' || v_value);
  begin
    with numbers as
     (select level eindeutig from dual connect by level <= 10),
    base as
     (select eindeutig, mod(eindeutig, 3) mehrdeutig from numbers)
    select eindeutig into v_value from base where eindeutig = 11;
  exception
    when no_data_found then
      dbms_output.put_line('v_value bei no_data_found = ' || v_value);
  end;
  -- create too many rows exception - v_value is NOT NULL
  begin
    with numbers as
     (select level eindeutig from dual connect by level <= 10),
    base as
     (select eindeutig, mod(eindeutig, 3) mehrdeutig from numbers)
    select eindeutig into v_value from base where mehrdeutig = 1;
  exception
    when too_many_rows then
      dbms_output.put_line('v_value bei too_many_rows ohne order = ' || v_value);
  end;
  -- create too many rows exception - v_value is NOT NULL
  begin
    with numbers as
     (select level eindeutig from dual connect by level <= 10),
    base as
     (select eindeutig, mod(eindeutig, 3) mehrdeutig from numbers)
    select eindeutig into v_value from base where mehrdeutig = 1 order by 1 desc;
  exception
    when too_many_rows then
      dbms_output.put_line('v_value bei too_many_rows mit order = ' || v_value);
  end;
end;

 

DBConcepts Sommerfest – die beste Veranstaltung des Jahres

Das DBC Sommerfest hat sich mittlerweile zu einem fixen Bestandteil des Sommers von vielen unseren Gästen etabliert. Auch dieses Jahr gibt es viel zu berichten.

Vergangenen Donnerstag (25.08.2022) haben sich im Laufe des Spätsommernachmittags zahlreiche Gäste zu unserem alljährlichen DBConcepts Sommerfest eingefunden und nutzten die Gelegenheit sich in einer malerischen Kulisse an der Alten Donau bei bestem Sommerwetter in einem entspannten Rahmen zu unterhalten.

Nach einer Stärkung am abwechslungsreichen Buffet, das keine Wünsche offenließ, starte das mit großer Spannung erwartete DBConcepts Pub Quiz.

Achtzehn Teams fanden sich innerhalb kürzester Zeit zusammen und bildeten 4er Teams mit den kreativsten Namen und stellten ihr Wissen unter erschwerten Bedingungen (Handynutzung war Tabu sowie ein Zeit Limit für die Beantwortung der Fragen) unter Beweis. Nach einundzwanzig Fragen aus unterschiedlichsten Kategorien und einer Schätzfrage entschied das „Team die 4 Fragezeichen“ das Rennen für sich, setzte sich knapp gegen das Team „Margarethen“ durch und nahm den Hauptgewinn, Sonos Roam Lautsprecher mit nach Hause.

Ich freue mich jedes Jahr auf dieses stimmige Fest – und auch heuer wieder tat es richtig gut, dabei zu sein: inspirierende Örtlichkeit, herzlicher Empfang, ungezwungenes Beisammensein, anregende Gespräche und bestelltes Schönwetter, was will man mehr“, so Roland F. ein Gast.

Auch Melanie R. erklärte:“ Ich war heuer bei vielen Sommerfesten – aber das DBC Sommerfest war eindeutig das beste!

Wir freuen uns sehr über das Feedback und über das nette Beisammensein mit allen Gästen! Eines ist sicher – Nächstes Jahr ist die DBC Sommer Party wieder ein fixer Bestandteil des Sommers – also gleich den letzten Donnerstag im August in die Kalender notieren und reservieren!“ so Klaus-Michael Hatzinger abschließend.

Fotos vom Abend finden Sie hier.

Sommerparty 2022

It’s Summer time und der Countdown läuft – am Donnerstag (25.08) findet unser legendäres DBConcepts Sommerfest in der La Crêperie, An der Oberen Alten Donau 6, 1210 Wien, statt.

Wir möchten Sie gerne über die Anreise,- und Parkmöglichkeiten informieren.

Anreise mit den öffentlichen Verkehrsmitteln (Routenplaner).

  • U1 bis zur Station VIC. Anschließend mit Stadtbus 20A Richtung Neue Donau acht Halte bis Sandrockgasse. Der Bus fährt 2-mal die Stunde. Genau Fahrtzeiten können Sie dem Fahrplan Danach ist ein Fußweg von ca. 7 Minuten zu bewältigen.
  • Mit der U6 bis Station Wien Neue Donau (Fahrplan U6) – anschließend ein Fußweg von ca. acht Minuten.
  • S-Bahn-Station Wien Floridsdorf – danach noch ein Fußweg von 7 Minuten

Parkmöglichkeiten für die Anreise mit dem Auto

La Crêperie, An der Oberen Alten Donau 6, 1210 Wien

Ferdinand-Kaufmann-Platz 16 (parkopedia.at). Bitte beachten Sie, dass die Kurzparkzone bis 22 Uhr gilt.

 

Datum: 25. August 2022
Ort: La Crêperie, An der Oberen Alten Donau 6, 1210 Wien
Uhrzeit: ab 16:00 Uhr bis 23:00h

Wir freuen uns auf Sie!!

P.S.: Es erwartet Sie eine Tombola mit einem sensationellen Hauptgewinn. Sowie unser legendärer Pub-Quiz mit großartigen Preisen für die ersten 3 platzierten Teams! Mitmachen ist selbstverständlich kein „Muss“ aber der Spaß ist garantiert!

 

 

Anmeldung zur DBConcepts Sommer-Party 2022

DBConcepts Sommer Party Feiern Sie mit uns den Sommer ganz relaxed an der Alten Donau bei einem fantastischen Grill-Buffet und kühlen Getränken!

Oracle SQL Model Clause Vertiefung

Grundlegender Aufbau

Der grundlegende Aufbau der Model Clause ist bereits in einem anderen Blog-Eintrag beschrieben, den sie HIER finden.

Weitere Steuerungsmöglichkeiten

Im ersten Blog-Artikel wurde nur das main_model beachtet und auch von diesem nur die verpflichtenden Teile. Ergänzen wir das ganze nun um die cell_reference_options.

Die Cell Reference Options definieren wie mit fehlenden und leeren Werten umgegangen wird und wie streng die Eindeutigkeit geprüft wird. Im Detail sieht das wie folgt aus:

IGNORE NAV
Wenn diese Anweisung inkludiert wird, dann werden folgende Default Werte bei NULL-Werten oder fehlenden Werten zurückgegeben

  • 0 für numerische Spalten
  • 01.2000 für Datumsspalten
  • Ein leerer String für Textspalten
  • NULL für alle anderen Datentypen

KEEP NAV (Default)
Wenn diese Anweisung inkludiert wird, wird immer NULL zurückgegeben, wenn ein Wert fehlt oder NULL ist

UNIQUE DIMENSION (Default)
Wenn diese Anweisung inkludiert ist, muss die Kombination der Spalten der PARTITION BY und der DIMENSION Spalten eine Zeile eindeutig identifizieren (die Spalten müssten also einen Unique Key definieren können)

UNIQUE SINGLE REFERENCEMit dieser Anweisung werden lediglich Referenzen auf eine einzelne Zelle auf der rechten Seite auf Uniqueness geprüft, nicht das gesamte Set

NAV Anweisung

Wenn Werte nicht gefunden werden, definiert diese Anweisung wie damit umgegangen wird. Als Beispiel auf Basis der vorhandenen Testdaten sollen die folgenden beiden Statements zeigen wie die Auswirkungen sind:

select schueler, note, schulstufe
  from schulnoten
 where schuelernummer = 1
   and fach = 'Deutsch' MODEL DIMENSION BY(schueler, schulstufe)
 MEASURES(note) keep nav(note [ 'Anton Anger',
           5 ] = note [ schueler = 'Anton Anger',
           schulstufe = 4 ]);

In diesem Fall mit KEEP NAV werden nicht vorhandene Werte mit NULL ausgegeben. Die Zeile mit Schulstufe 5 hat also in der Notenspalte einen NULL Wert stehen.

select schueler, note, schulstufe
  from schulnoten
 where schuelernummer = 1
   and fach = 'Deutsch' MODEL DIMENSION BY(schueler, schulstufe)
 MEASURES(note) ignore nav(note [ 'Anton Anger',
           5 ] = note [ schueler = 'Anton Anger',
           schulstufe = 4 ]);

Wenn nun IGNORE NAV verwendet wird, dann wird der Wert 0 eingetragen.

UNIQUE Anweisung

Die Unique Anweisung ist sehr simpel umzusetzen. Auf Basis der schon im ersten Blogeintrag verwendeten Testdaten würde folgendes Statement fehlschlagen:

  from schulnoten
 where schuelernummer = 1
   and fach = 'Deutsch' MODEL DIMENSION BY(schueler) MEASURES(note)
 unique dimension (note [ schueler = 'Anton Anger'
                 ] = round(avg(note) [ schueler = 'Anton Anger' ], 0));

Der Grund dafür ist simpel: Die Spalte SCHUELER definiert keine eindeutige Zuweisung. Um das Statement valid zu machen, müsste man das Jahr oder die Schulstufe ergänzen, das würde dann wie folgt aussehen:

select schueler, note
  from schulnoten
 where schuelernummer = 1
   and fach = 'Deutsch' MODEL DIMENSION BY(schueler, schulstufe)
 MEASURES(note) unique
 dimension(note [ schueler = 'Anton Angera',
                 schulstufe = 4
                 ] = round(avg(note) [ schueler = 'Anton Angera',
                           schulstufe between 1 and 3 ],

Oder alternativ die UNIQUE Anweisung ändern, was dann so aussehen würde:

select schueler, note
  from schulnoten
 where schuelernummer = 1
   and fach = 'Deutsch' MODEL DIMENSION BY(schueler) MEASURES(note)
 unique single
 reference(note [ schueler = 'Anton Anger'
                 ] = round(avg(note) [ schueler = 'Anton Angera' ], 0));

 

APEX: Calendar Custom Classes

APEX: Calendar Custom Classes

Der native Kalender in APEX bietet bereits eine Vielzahl an möglichen Klassen um Termine passend anzuzeigen. Die Inline-Hilfe in APEX bietet folgende Liste von 14 Klassen an

 

Wie der letzte Satz andeutet, ist auch das Hinzufügen von eigenen zusätzlichen Klassen möglich.
Da die Dokumentation hier keine klaren Hinweise bietet, soll hier kurz aufgelistet werden, wie diese Klassen anzulegen sind.

Die beste Orientierung bietet hier eine der Klassen, welche von APEX bereitgestellt werden:
.fc .fc-event.apex-cal-black {
   background-color:#303030;
   border-color:#303030;
   color:#fff
}

Der Klassenname, welche in APEX in einer Spalte übergeben wird muss also in auf folgende Weise in einem CSS-File oder Inline auf der Seite eingebaut werden:

.fc .fc-event.[CUSTOM-CLASS_NAME] {
   CSS-Eigenschaften
}

Bei den CSS-Eigenschaften kann man sich ebenfalls an den Default-Klassen orientieren, die drei relevantesten Eigenschaften sind offensichtlicherweise Background, (Foreground-/Font-)Color und Border. Ein paar weitere Ideen, welche anderen CSS-Eigenschaften hier noch sinnvoll einsetzbar sind wären z.B.:

  • Alles was die Schrift betrifft wie
    *Font-weight
    *Font-family
    *Font-decoration

 

  •  Weitere Spielereien wie
    *Border-radius
    *Border-style

Als kleine Unterstützung bei der Recherche für weitere Styling Möglichkeiten:
Die Elemente selbst sind Links (<a>), welche über eine andere Klasse (fc-h-event) als Block-Element dargestellt wird, Klassen welche sich also lediglich auf Inline-Elemente auswirken werden keinerlei Effekt haben.