Agile Oracle database modeling and development - APEX Connect 2020

Torsten Kleiber
Torsten KleiberSoftware Architect, Project Manager, Application Manager at IKB Deutsche Industriebank AG um IKB Deutsche Industriebank AG
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Agile Oracle Datenbank-
Modellierung und -Entwicklung
6.5.2020 - Torsten Kleiber



1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Agenda
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Agenda
Einführung
Über meinen Arbeitgeber
Über mich
Was ist Test Driven Development (TDD)?
Wie sieht meine Datenbank-Entwicklungsumgebung aus?
utPLSQL - Tes ramework für Oracle Datenbank
TDD in der Datenbank-Entwicklung
Datenbank Design mit Liquibase
So ware Development Lifecycle (SDLC)
TDD in der Datenbank-Modellierung
TDD in der Qualitätssicherung
Umgang mit Merge Konflikten
Fazit
Q&A



2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Einführung
Was meinen wir eigentlich, wenn wir sagen wir wollen agil sein?
Anforderungen sind nicht fest und können sich während der Realisierung ändern!
Parallelisierbarkeit der Umsetzung
Dann machen wir doch Features in Branches!
Wie merged man die, wenn diese einsatzbereit sind?
Wie erkenne ich, was von was abhängig ist?
Automa sche Tests zeigen, ob nach dem Merge noch alles funk oniert!
Und wie bekomme ich genügend automa sche Tests?
Test Driven Development wird das schon richten!
Ja - in der Frontend-/Java-/XXX-Entwicklung geht das vielleicht!
Was ist aber die wirkliche Grundlage der meisten unserer Anwendungen?
Die Oracle Datenbank mit Datenmodell und Programmiersprache PL/SQL!
Da geht das alles aber doch gar nicht!
Warum eigentlich nicht?
Wie geht das: agil und testgestrieben von der Anforderung bis zum Refactoring?
Begeben wir uns auf unsere Reise!


3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Über meinen Arbeitgeber



4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Über mich
Torsten Kleiber
So ware-Architekt, Entwickler, DevOps,
Administrator
Kreditpla orm
Seit 20 Jahren bei der IKB
23 Jahre Erfahrung
PL/SQL
Forms & Reports
ADF
SOA Mediator
Architektur & Infrastruktur
Fusion Middleware
Development Tools
Development Lifecycle



5
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
““
Was ist Test Driven Development (TDD)?
Test-driven development (TDD) is a so ware development
process that relies on the repe on of a very short development
cycle:
Requirements are turned into very specific test cases, then the
so ware is improved so that the tests pass.
This is opposed to so ware development that allows so ware to
be added that is not proven to meet requirements.
— Wikipedia



6.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD: einfacher Zyklus



6.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD: globaler Zyklus



6.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD: Voraussetzungen
vollständige Entwicklungsumgebung pro Entwickler inclusive Datenbank
am besten lokal
generische Build-, Deployment- und Test-Prozesse für Entwicklung und CI
Open Mind: Entwickler muss die Methode akzep eren und leben!



6.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Wie sieht meine Datenbank-
Entwicklungsumgebung aus?
Neben IDE’s ist in unserem Fall die Datenbank bereitzustellen.
Folgende Op onen bieten sich an:
seperate Schemas für jeden User in einer Datenbank
nur bei 1 Applika onsschema
aufwändige Applika ons-Konfigura on
Grant-/Synonym-Hölle zwischen Daten- und Applika onsschemas
Virtuelle Maschinen oder Docker Container
rela v hohe Laufzeiten bei wiederholter Erstellung
Snapshot Copies
EE mit Mul tenant Op on erforderlich (> 2 Snapshot Copies)
schnelle Erstellung
…



7.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Datenbank: Vorbereitung
1. Download (Pre-Built Developer VMs for Oracle
VM VirtualBox)
2. VM impor eren und starten per GUI oder CLI:
VBoxManage import %download_path%DeveloperDaysVM2019-05-31_20.ova ^
--vsys 0 --cpus 4 --memory 16384 --eula accept
VBoxManage startvm "Oracle DB Developer VM"
3. Gasterweiterungen manuell einlegen und ausführen, danach Savepoint erstellen
VBoxManage snapshot "Oracle DB Developer VM" take base --live
4. utPLSQL in PDB installieren
curl -Lk gitreleases.dev/gh/utPLSQL/utPLSQL/latest/utPLSQL.zip -o utPLSQL.zip
tar -xf utPLSQL.zip
pushd utPLSQLsource
sqlplus sys/oracle@//localhost/orcl as sysdba @install_headless.sql
5. Snap Shot Copy konfigurieren
connect sys/oracle@//localhost/orclcdb as sysdba
-- Ändern des Parameters clonedb der CDB
alter system set clonedb=true scope=spfile;
shutdown immediate
startup
-- PDB orcl nur für Lesen öffnen, da hier nur als Template genutzt
alter pluggable database orcl open read only force;
Database App Development VM



7.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Datenbank: Snapshot Copy erzeugen / löschen
1. Pro User oder Branch wird eine neue Snapshot Copy erzeugt und je nach
Anforderung der zu nutzende Servicename übergeben.
2. Das Löschen erfolgt ebenfalls über den Servicenamen.
-- Anmelden an die CDB
connect sys/oracle@//localhost/orclcdb as sysdba
alter pluggable database &1 close;
drop pluggable database &1 including datafiles;
-- Anmelden an die CDB
connect sys/oracle@//localhost/orclcdb as sysdba
-- PDB orcl nur für Lesen öffnen, da hier nur als Template genutzt
alter pluggable database orcl open read only force;
create pluggable database &1 from orcl create_file_dest = '/u01/app/oracle/oradata/ORCLCDB' snapshot copy
alter pluggable database &1 open;



7.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
utPLSQL - Testframework für Oracle Datenbank
ursprünglich von Steven Feuerstein entwickelt
2016 komple neu geschrieben und jetzt wirklich reif für den
professionellen Test
100% Opensource und kostenlos
unterstützt den TDD Zyklus
einfach
utPLSQL Name unglücklich gewählt, da nicht nur für Unit-Tests nutzbar
selbst in PL/SQL geschrieben
Tests sind selbst Packages
alles testbar, was ich in der Datenbank machen kann
orien ert sich an anderen Frameworks wie jUnit etc.
zum Vergleich erwarteter und aktueller Ergebnisse
arbeitet mit (Vorsicht mit Forma ern!)
über PL/SQL (ut.run), CLI, SQL Developer / TOAD Plugin
verschiedene für Screen, XUnit, Teamcity, Sonar und
bringt mit
installierbar
Expecta ons und Matcher
Annota onen
Ausführung
Reporter Code Coverage
Best Prac ces


8
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD in der Datenbank-Entwicklung
Wir wollen eine einfache Annuität berechnen:
Demo me → 



9.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neues Test Package
1. Erzeuge einen neuen Branch und pushe ihn
2. Schreibe einen neuen Test!
CREATE OR REPLACE PACKAGE test_annuitaeten AS
--%suite(Annuitaetenberechnung)
--%test(Normale Nutzung)
--%tags(unit)
PROCEDURE normale_nutzung;
END;
/
3. Prüfe, dass der Test scheitert!



9.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neuer Test Package Body
1. Schreibe die Tes mplemen erung!
2. Prüfe, dass der Test scheitert!
CREATE OR REPLACE PACKAGE BODY test_annuitaeten AS
PROCEDURE normale_nutzung IS
BEGIN
ut.expect(annuitaeten.get_annuitaet(250000, 0.05, 10)).to_equal(32376.143741364173874951668563451
END;
END;
/



9.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Code
1. Schreibe genau so viel Code, das der Test erfolgreich ist!
2. Prüfe, dass der Test erfolgreich ist!
CREATE OR REPLACE PACKAGE annuitaeten AS
FUNCTION get_annuitaet (
kreditsumme IN NUMBER,
zinssatz IN NUMBER,
laufzeit IN NUMBER
) RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY annuitaeten AS
FUNCTION get_annuitaet (
kreditsumme IN NUMBER,
zinssatz IN NUMBER,
laufzeit IN NUMBER
) RETURN NUMBER IS
BEGIN
RETURN kreditsumme * (((1 + zinssatz) ** laufzeit) * zinssatz) / (((1 + zinssatz) ** laufzeit) -
END;
END;
/



9.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
““
Datenbank Design mit Liquibase
One of the biggest ques ons is how to make evolu onary design
work for databases.
— Pramod Sadalage (Thoughtworks)



10.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Liquibase: Einführung
migra ons-basiertes Datenbank-Change-Management
, u.a. Oracle, MySQL, SQL Server,
Sybase, DB2, SQLite …
: CLI, ANT, Maven, Spring …
Textbasiertes Change Log File steuert die Ausführungs-Reihenfolge
atomare Change Sets inline oder als Include
: Eine Änderung pro Change Set
Change Set Formate:
deklara v: XML, YAML, JSON (generiert aus den Changes SQL für Ziel-
Datenbank, teilweise inclusive Rollback)
(Datenbank-spezifische Dialekte möglich)
/ der Datenbank mit incl. Hash
Steuerung von Changesets durch vordefinierte (Datenbank, SQL
Abfrageergebnis, …)
Steuerung durch dem Runner mitgegebene (Testdaten nur auf Test, …)
dem Runner mitgegebene können im Changeset als Variable genutzt
werden (Tabelle, Spalte, …)
datenbankunabhängig
Runner
Best Prac ce
SQL
Update Rollback Tracking in Datenbanktabellen
Pre-Condi ons
Contexts
Parameter



10.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Liquibase CE: Community Edition
kostenlose Variante von Liquibase
Viele Oracle Objekte werden durch die nicht unterstützt, z.B.
PL/SQL
Change Log Format SQL unterstützt komple en Sprachumfang von Datenbanken
Rollback muss dann, wenn erforderlich, auch selbst in SQL geschrieben werden
Reihenfolge der Ausführung wird selbst festgelegt
Change Tags



10.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Liquibase CE mit Community Oracle Extensions
unterstützen weitere Objekte, u.a.
Check-Constraints
Trigger
Materialized Views
Disable/Enable Check-Constraints/Trigger
Merge
Truncate
kein PL/SQL
seit mehreren Jahren nicht mehr gepflegt
Oracle Change Tags werden als Pro Tag erkannt und ohne Lizenz verweigert:
<changeSet author="torst (generated)" id="1573059733408-39">
<ora:createTrigger
...
Change Type 'pro:createTrigger' is not allowed without a valid Liquibase Pro License.
Einsatz m.E. deshalb nicht zu empfehlen
Oracle Extensions



10.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Liquibase Professional Edition
kostenpflich ge Liquibase Version von Da cal
der Liquibase PRO-Version unterstützen weitere Objekte, u.a.
Check-Constraints
PL/SQL (Func on/Procedure, Package, Package Body)
Synonyme
Trigger
Unused Columns
keine Materialized Views
kein Rollback
Preis abhängig von
14 tägige verfügbar
Einsatz nicht getestet
Change Tags
Anzahl Datenbankverbindungen
Trial



10.5
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
>_
Liquibase CE mit Oracle’s Oracle Extensions
Capture von Objekten nur per SQLcl ab Version 19.2
dafür zusätzliche Tabelle DATABASECHANGELOG_EXPORT
als XML Changeset
über DBMS_METADATA
incl. Rollback
derzeit nur für angemeldeten Benutzer
Reihenfolge wird automa sch erzeugt
DDL Preview Modus
Deployment von Objekten
per SQLcl ab Version 19.2.1
per Liquibase-API’s mit oracle-liquibase.jar in in liquibase/lib/ext
unterstützt Oracle Datenbank 11.2+
supportete Objek ypen
Dokumenta on



10.6
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Welche Variante nimmt man nun?
Analyse über ein Legacy-System, hier
das Demo-Schema HR



10.7
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
““
““
““
““
““
““
““
Liquibase ORA: Fazit
Oracle’s Liquibase Extensions zeichnet Oracle-Datenmodelle und
-Programme auf und kann diese auch wieder einspielen.
Daten werden nicht aufgezeichnet und eingespielt.
Diff nach Änderung wird nicht erzeugt.
Eigenes Change Set Format, Schema nicht dokumen ert.
Nutzung nur mit gebündelter Liquibase Version möglich.
Die Extension hat prinzipiell Potenzial.
→ erste Version, später wieder anschauen!


10.8
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
““
““
““
Liquibase CE: Generieren des Legacy Change
Logs
Generierung leidet unter mangelnden Support von Oracle
Objekten.
Nacharbeiten wiegen Generierung der Objekte nicht auf.
Wenn ich sowieso SQL Changesets nutzen will, weil ich nur dort
alle Oracle Objekte nutzen kann, gibt es vielleicht einen anderen
Weg der Generierung außerhalb von Liquibase?



10.9
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
SQL Developer: Legacy Database Change Log (1)
1. Tools → Database Export



10.10
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
SQL Developer: Legacy Database Change Log (2)
2. Master SQL File wird mitgeneriert
3. Mit Tastaturmakros ist daraus leicht das Database Change Log zu erzeugen
Bei Triggern und PL/SQL muss der endDelimiter korrekt auf
"n/s*n>|n/s*/$" gesetzt werden! (n = Zeilenumbruch, s* =
beliebig viele Whitespace-Zeichen, $ = Dateiende, | = oder)
--------------------------------------------------------
-- File created - Thursday-November-07-2019
--------------------------------------------------------
@X:gitde.kleiber.demos.oracle.database.tddsrcmainresourcesliquibaselb_sqldSEQUENCESDEPARTMENTS_S
...
@X:gitde.kleiber.demos.oracle.database.tddsrcmainresourcesliquibaselb_sqldPROCEDURESADD_JOB_HIST
...
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:appdba="http://www.datical.n
<changeSet id="0000000000000-1" author="legacy">
<sqlFile path="SEQUENCES/DEPARTMENTS_SEQ.sql" relativeToChangelogFile="true"/>
</changeSet>
...
<changeSet id="0000000000000-41" author="legacy">
<sqlFile path="PROCEDURES/ADD_JOB_HISTORY.sql" relativeToChangelogFile="true" endDelimiter="n/s
</changeSet>
...




10.11
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Liquibase: Sync Legacy System mit Changelog
Anforderungen:
Datenmodell und Daten sollen nicht geändert werden
Liquibase Tabellen sollen angelegt werden
Change Sets sollen als ausgeführt eingetragen werden
→ Alles in einem Befehl:
liquibase --driver=oracle.jdbc.OracleDriver ^
--classpath="%oracle_home%ojdbc8.jar" ^
--changeLogFile=%~dp0lb_sqldcontroller.xml ^
--url="jdbc:oracle:thin:@localhost/%1" ^
--username=hr ^
--password=oracle ^
changelogSync



10.12
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
““
““
““
““
Liquibase CE: Fazit
Liquibase CE ist für Oracle nutzbar,
wenn spezifische Oracle Objekte wie z.B. Check Constraints
oder PL/SQL nicht genutzt werden müssen
oder für diese SQL Change Sets inklusive SQL Rollback
Statements erzeugt werden.
Forma ed SQL Changelogs sollten nicht genutzt werden, diese
sind stark bugbeha et.
Sta dessen sollte der genutzt werden.
Sowohl Legacy als auch Updates generell lassen sich per SQL
Developer Database Export erzeugen.
Change sqlFile



10.13
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Software Development Lifecycle (SDLC)
Empfehlung:
Toolchain, die Branches und Pull Requests (incl. Merge) automa sch baut
hier: Jenkins Mul branch Pipeline mit Github- oder Bitbucket-Repository



11.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Ablauf
1. Anforderung sollte möglichst klein
aber unabhängig sein
2. Branch wird nach jedem Push in
Branch gebaut
3. Pull Request wird nach jedem Push
in Branch oder Master gebaut
4. Beim Bauen wird der Master auf
den Pull Request testweise
gemerged



11.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD in der Datenbank-Modellierung
Die Daten weisen auf den ISO 3166-1 ALPHA-2 Code hin, aber da fehlen doch
Validierungen?
Demo me → 


12.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neuer Branch
1. Erzeuge einen neuen Branch und pushe ihn



12.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neues Test Package
1. Schreibe einen neuen Test!
CREATE OR REPLACE PACKAGE test_iso3166 AS
--%suite(ISO 3166 Laendercodes)
--%test(ALPHA-2 Code muss uppercase sein)
--%throws(-02290)
--%tags(model)
PROCEDURE alpha2_uppercase;
END;
/
2. Prüfe, dass der Test scheitert!



12.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neuer Test Package Body
1. Schreibe die Tes mplemen erung!
CREATE OR REPLACE PACKAGE BODY test_iso3166 AS
PROCEDURE alpha2_uppercase IS
BEGIN
INSERT INTO countries (country_id, country_name, region_id)
VALUES ('xx', 'name', 1);
END;
END;
/
2. Prüfe, dass der Test scheitert!



12.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Code
1. Schreibe genau so viel Code, das der Test erfolgreich ist!
ALTER TABLE "HR"."COUNTRIES"
ADD CONSTRAINT "COUNTRY_ID_UPPERCASE" CHECK ( country_id = upper(country_id) ) ENABLE;
2. Prüfe, dass der Test erfolgreich ist!



12.5
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Weiterer Test
1. Schreibe einen weiteren Test und die Implemen erung!
...
--%test(ALPHA-2 Code muss zweistellig sein)
--%throws(-02290)
--%tags(model)
PROCEDURE alpha2_zweistellig;
...
PROCEDURE alpha2_zweistellig IS
BEGIN
INSERT INTO countries (country_id, country_name, region_id)
VALUES ('X', 'name', 1);
END;
...
2. Prüfe, dass der Test scheitert!



12.6
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Code
1. Schreibe genau so viel Code, das der Test erfolgreich ist!
2. Prüfe, dass der Test erfolgreich ist!
ALTER TABLE "HR"."COUNTRIES"
ADD CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2" CHECK (REGEXP_LIKE(COUNTRY_ID, '^[[:alpha:]]{2}$')) ENABL



12.7
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Refactor
1. Verbessere den Code, ohne sein Verhalten zu ändern!
2. Prüfe, dass der Test erfolgreich ist!
ALTER TABLE "HR"."COUNTRIES" DROP CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2";
ALTER TABLE "HR"."COUNTRIES"
ADD CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2" CHECK (REGEXP_LIKE(COUNTRY_ID, '^[[:alpha:]]{2}$') AND CO
ALTER TABLE "HR"."COUNTRIES" DROP CONSTRAINT "COUNTRY_ID_UPPERCASE";



12.8
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Skripte erstellen, testen und versionieren (1)
1. Skripte wie gehabt aus SQL Developer erstellen
2. Testen
a. Apply Changelog auf lokalen Entwicklungs-Snapshot
b. Test mit SQL Developer
c. Prüfen, ob alle neuen Tests erfolgreich sind



12.9
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Skripte erstellen, testen und versionieren (2)
3. Commit



12.10
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Branch pushen



12.11
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
CI: Branch wird gebaut und getestet



12.12
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Pull Request nach 1. Branch Commit erstellen



12.13
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
CI: Pull Request wird nach jedem Push gebaut



12.14
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
TDD in der Qualitätssicherung
Braucht jede Tabelle einen Primary Key?



13.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Neues Test Package
1. Erzeuge einen neuen Branch und pushe ihn
2. Schreibe einen neuen Test!
CREATE OR REPLACE PACKAGE test_qa AS
--%suite(Qualitaetsanalyse)
--%test(Jede Tabelle muss einen Primary Key haben)
--%tags(qa)
PROCEDURE table_pk;
END;
/
3. Prüfe, dass der Test scheitert!



13.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Code
1. Schreibe genau so viel Code, das der Test erfolgreich ist!
2. Prüfe, dass der Test erfolgreich ist!
CREATE OR REPLACE PACKAGE BODY test_qa AS
PROCEDURE table_pk IS
l_expected SYS_REFCURSOR;
l_actual SYS_REFCURSOR;
BEGIN
OPEN l_expected FOR SELECT * FROM user_tables t WHERE 0=1;
OPEN l_actual FOR SELECT * FROM user_tables t WHERE NOT EXISTS (
SELECT * FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P'
);
ut.expect(l_actual).to_equal(l_expected);
END;
END;
/



13.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Code
1. Schreibe genau so viel Code, das der Test erfolgreich ist!
2. Prüfe, dass der Test erfolgreich ist!
CREATE OR REPLACE PACKAGE BODY test_qa AS
PROCEDURE table_pk IS
l_expected SYS_REFCURSOR;
l_actual SYS_REFCURSOR;
BEGIN
OPEN l_expected FOR SELECT * FROM user_tables t WHERE 0=1;
OPEN l_actual FOR SELECT * FROM user_tables t WHERE NOT EXISTS (
SELECT * FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P'
) AND t.table_name != 'DATABASECHANGELOG';
ut.expect(l_actual).to_equal(l_expected);
END;
END;
/



13.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Refactor
1. Verbessere den Code, ohne sein Verhalten zu ändern!
2. Prüfe, dass der Test erfolgreich ist!
CREATE OR REPLACE PACKAGE BODY test_qa AS
PROCEDURE table_pk IS
l_expected SYS_REFCURSOR;
l_actual SYS_REFCURSOR;
BEGIN
OPEN l_expected FOR SELECT t.table_name FROM user_tables t WHERE 0=1;
OPEN l_actual FOR SELECT t.table_name FROM user_tables t WHERE NOT EXISTS (
SELECT 1 FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P'
) AND t.table_name != 'DATABASECHANGELOG';
ut.expect(l_actual).to_equal(l_expected);
END;
END;
/



13.5
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
weitere SDLC Schritte
1. Skripte erstellen, testen und versionieren
2. Branch pushen
3. CI: Branch wird gebaut und getestet
4. Pull Request nach 1. Branch Commit erstellen
5. CI: Pull Request wird nach jedem Push gebaut



13.6
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Merge Pull Request



13.7
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Branch löschen



13.8
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Umgang mit Merge Konflikten



14.1
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Merge Konflikt im Pull Request für Branch
model



14.2
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Merge Konflikt lösen



14.3
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Commit Merge



14.4
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
CI: Branch wird gebaut und getestet



14.5
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
CI: Pull Request wird nach jedem Push gebaut



14.6
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
weitere SDLC Schritte
1. Merge Pull Request
2. Branch löschen



14.7
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Master Build erfolgreich incl. aller Tests/
Änderungen



14.8
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Fazit
Yes - we can agile Datenbank-Entwicklung und Modellierung!
Branchen und Mergen sind möglich!
Paralleles Entwickeln/Testen unter Berücksich gung von Abhängkeiten möglich!
Toolchain mit Liquibase, utPLSQL, GitHub/Bitbucket, Jenkins unterstützt uns



15
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Q&A



16
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Referenzen
, Xaver Pigeon
, Johannes Ahrends, CarajanDB
, Wikipedia
, Pramod Sadalage, Thoughtworks
, Jeff Smith, Oracle
, Dokumenta on, Oracle
, AskTom, Oracle
Test-Driven Development: global cycle
Mul tenant Snapshot Copy
Annuitätendarlehen
Evolu onary Database Design
Liquibase and SQLcl
Using Liquibase with SQLcl
Primary Key



17
Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung
@develishdevelop #APEXCONN20 #AgileOracleDatabase
Referenzen
, Xaver Pigeon
, Johannes Ahrends, CarajanDB
, Wikipedia
, Pramod Sadalage, Thoughtworks
, Jeff Smith, Oracle
, Dokumenta on, Oracle
, AskTom, Oracle
Test-Driven Development: global cycle
Mul tenant Snapshot Copy
Annuitätendarlehen
Evolu onary Database Design
Liquibase and SQLcl
Using Liquibase with SQLcl
Primary Key



17
1 von 66

Recomendados

Regulatorics: Offside is when the referee whistles - DOAG 2018 von
Regulatorics: Offside is when the referee whistles - DOAG 2018Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Torsten Kleiber
51 views32 Folien
Our way to 19c - DOAG 2020 von
Our way to 19c - DOAG 2020Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Torsten Kleiber
64 views31 Folien
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017 von
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Torsten Kleiber
1.7K views60 Folien
Bob the Builder - Build & Deploy von ADF Enterprise Anwendungen von
Bob the Builder - Build & Deploy von ADF Enterprise AnwendungenBob the Builder - Build & Deploy von ADF Enterprise Anwendungen
Bob the Builder - Build & Deploy von ADF Enterprise AnwendungenTorsten Kleiber
244 views50 Folien
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014. von
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Torsten Kleiber
1.3K views29 Folien
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG von
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AGQualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AGTorsten Kleiber
5.8K views48 Folien

Más contenido relacionado

Was ist angesagt?

Java magazin9 2012_wls 12c_das_dutzend_ist_voll von
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollWolfgang Weigend
715 views11 Folien
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und... von
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
171 views20 Folien
Vortragsreihe Dortmund: Unified Development Environments von
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsThorsten Kamann
989 views48 Folien
Einführung in Puppet und Vagrant von
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrants0enke
6.6K views39 Folien
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript von
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptOPEN KNOWLEDGE GmbH
1.9K views69 Folien
Von Maven zu Gradle in 45 Minuten von
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenQAware GmbH
978 views37 Folien

Was ist angesagt?(20)

Java magazin9 2012_wls 12c_das_dutzend_ist_voll von Wolfgang Weigend
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Wolfgang Weigend715 views
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und... von gedoplan
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
gedoplan171 views
Vortragsreihe Dortmund: Unified Development Environments von Thorsten Kamann
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
Thorsten Kamann989 views
Einführung in Puppet und Vagrant von s0enke
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
s0enke6.6K views
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript von OPEN KNOWLEDGE GmbH
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
OPEN KNOWLEDGE GmbH1.9K views
Von Maven zu Gradle in 45 Minuten von QAware GmbH
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 Minuten
QAware GmbH978 views
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und... von gedoplan
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
gedoplan29 views
Zend Framework von luckec
Zend FrameworkZend Framework
Zend Framework
luckec1.4K views
Stephan Kaps – IT-Tage 2015 – Flyway vs. LiquiBase – Battle der Datenbankmigr... von Informatik Aktuell
Stephan Kaps – IT-Tage 2015 – Flyway vs. LiquiBase – Battle der Datenbankmigr...Stephan Kaps – IT-Tage 2015 – Flyway vs. LiquiBase – Battle der Datenbankmigr...
Stephan Kaps – IT-Tage 2015 – Flyway vs. LiquiBase – Battle der Datenbankmigr...
Enterprise Java Batch mit Spring von denschu
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Spring
denschu995 views
Gameduell Glassfish Migration von dehms
Gameduell Glassfish MigrationGameduell Glassfish Migration
Gameduell Glassfish Migration
dehms1.1K views
PRADO - Erstellung wiederverwendbarer Enterprise-Applikationen von luckec
PRADO - Erstellung wiederverwendbarer Enterprise-ApplikationenPRADO - Erstellung wiederverwendbarer Enterprise-Applikationen
PRADO - Erstellung wiederverwendbarer Enterprise-Applikationen
luckec771 views
Server Revolutions- Der Spring Source DM Server von Sandro Sonntag
Server Revolutions- Der Spring Source DM ServerServer Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM Server
Sandro Sonntag600 views
Article - JDK 8 im Fokus der Entwickler von Wolfgang Weigend
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der Entwickler
Wolfgang Weigend1.4K views

Similar a Agile Oracle database modeling and development - APEX Connect 2020

20160310_ModernApplicationDevelopment_NoSQL_KPatenge von
20160310_ModernApplicationDevelopment_NoSQL_KPatenge20160310_ModernApplicationDevelopment_NoSQL_KPatenge
20160310_ModernApplicationDevelopment_NoSQL_KPatengeKarin Patenge
389 views39 Folien
Oracle Technology Monthly Oktober 2017 von
Oracle Technology Monthly Oktober 2017Oracle Technology Monthly Oktober 2017
Oracle Technology Monthly Oktober 2017oraclebudb
1.9K views17 Folien
Oracle Database 12c Release 2 von
Oracle Database 12c Release 2 Oracle Database 12c Release 2
Oracle Database 12c Release 2 oraclebudb
736 views40 Folien
Überblick zu Oracle Database 12c Release 2 von
Überblick zu Oracle Database 12c Release 2Überblick zu Oracle Database 12c Release 2
Überblick zu Oracle Database 12c Release 2Ulrike Schwinn
442 views40 Folien
2008 - Basta!: DAL DIY von
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIYDaniel Fisher
267 views36 Folien
Anwendungsmodernisierung mit Oracle Application Express (APEX) von
Anwendungsmodernisierung mit Oracle Application Express (APEX)Anwendungsmodernisierung mit Oracle Application Express (APEX)
Anwendungsmodernisierung mit Oracle Application Express (APEX)Niels de Bruijn
1.7K views70 Folien

Similar a Agile Oracle database modeling and development - APEX Connect 2020(20)

20160310_ModernApplicationDevelopment_NoSQL_KPatenge von Karin Patenge
20160310_ModernApplicationDevelopment_NoSQL_KPatenge20160310_ModernApplicationDevelopment_NoSQL_KPatenge
20160310_ModernApplicationDevelopment_NoSQL_KPatenge
Karin Patenge389 views
Oracle Technology Monthly Oktober 2017 von oraclebudb
Oracle Technology Monthly Oktober 2017Oracle Technology Monthly Oktober 2017
Oracle Technology Monthly Oktober 2017
oraclebudb1.9K views
Oracle Database 12c Release 2 von oraclebudb
Oracle Database 12c Release 2 Oracle Database 12c Release 2
Oracle Database 12c Release 2
oraclebudb736 views
Überblick zu Oracle Database 12c Release 2 von Ulrike Schwinn
Überblick zu Oracle Database 12c Release 2Überblick zu Oracle Database 12c Release 2
Überblick zu Oracle Database 12c Release 2
Ulrike Schwinn442 views
Anwendungsmodernisierung mit Oracle Application Express (APEX) von Niels de Bruijn
Anwendungsmodernisierung mit Oracle Application Express (APEX)Anwendungsmodernisierung mit Oracle Application Express (APEX)
Anwendungsmodernisierung mit Oracle Application Express (APEX)
Niels de Bruijn1.7K views
Docker-Images mit vorinstallierter Instanz einer Oracle-DB von Peter Ramm
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Peter Ramm36 views
Boost your APEX Deployment and Provisioning with Docker von Steven Grzbielok
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with Docker
Steven Grzbielok1.3K views
20181210_ITTage2018_OracleNoSQLDB_KPatenge von Karin Patenge
20181210_ITTage2018_OracleNoSQLDB_KPatenge20181210_ITTage2018_OracleNoSQLDB_KPatenge
20181210_ITTage2018_OracleNoSQLDB_KPatenge
Karin Patenge66 views
MT AG: 7 gute Gründe warum Apex von MT AG
MT AG: 7 gute Gründe warum ApexMT AG: 7 gute Gründe warum Apex
MT AG: 7 gute Gründe warum Apex
MT AG1.8K views
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit... von Lukas Eder
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
Lukas Eder7.4K views
DOAG Webinar Oracle und Docker von Stefan Oehrli
DOAG Webinar Oracle und DockerDOAG Webinar Oracle und Docker
DOAG Webinar Oracle und Docker
Stefan Oehrli303 views
20190604_DOAGDatabase2019_OracleNoSQLDB_for_DBAs von Karin Patenge
20190604_DOAGDatabase2019_OracleNoSQLDB_for_DBAs20190604_DOAGDatabase2019_OracleNoSQLDB_for_DBAs
20190604_DOAGDatabase2019_OracleNoSQLDB_for_DBAs
Karin Patenge132 views
20181120_DOAG_OracleNoSQLDB_KPatenge von Karin Patenge
20181120_DOAG_OracleNoSQLDB_KPatenge20181120_DOAG_OracleNoSQLDB_KPatenge
20181120_DOAG_OracleNoSQLDB_KPatenge
Karin Patenge80 views
Big Data Konnektivität von Trivadis
Big Data KonnektivitätBig Data Konnektivität
Big Data Konnektivität
Trivadis439 views
Oracle-DB: Beeinflussen der Ausführungspläne von SQL-Statements ohne Code-Anp... von Peter Ramm
Oracle-DB: Beeinflussen der Ausführungspläne von SQL-Statements ohne Code-Anp...Oracle-DB: Beeinflussen der Ausführungspläne von SQL-Statements ohne Code-Anp...
Oracle-DB: Beeinflussen der Ausführungspläne von SQL-Statements ohne Code-Anp...
Peter Ramm347 views
Spontan testen! Das eigene Test Lab, für jeden in der Cloud! von Peter Kirchner
Spontan testen! Das eigene Test Lab, für jeden in der Cloud!Spontan testen! Das eigene Test Lab, für jeden in der Cloud!
Spontan testen! Das eigene Test Lab, für jeden in der Cloud!
Peter Kirchner777 views

Agile Oracle database modeling and development - APEX Connect 2020

  • 1. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Agile Oracle Datenbank- Modellierung und -Entwicklung 6.5.2020 - Torsten Kleiber    1
  • 2. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Agenda 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Agenda Einführung Über meinen Arbeitgeber Über mich Was ist Test Driven Development (TDD)? Wie sieht meine Datenbank-Entwicklungsumgebung aus? utPLSQL - Tes ramework für Oracle Datenbank TDD in der Datenbank-Entwicklung Datenbank Design mit Liquibase So ware Development Lifecycle (SDLC) TDD in der Datenbank-Modellierung TDD in der Qualitätssicherung Umgang mit Merge Konflikten Fazit Q&A    2
  • 3. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Einführung Was meinen wir eigentlich, wenn wir sagen wir wollen agil sein? Anforderungen sind nicht fest und können sich während der Realisierung ändern! Parallelisierbarkeit der Umsetzung Dann machen wir doch Features in Branches! Wie merged man die, wenn diese einsatzbereit sind? Wie erkenne ich, was von was abhängig ist? Automa sche Tests zeigen, ob nach dem Merge noch alles funk oniert! Und wie bekomme ich genügend automa sche Tests? Test Driven Development wird das schon richten! Ja - in der Frontend-/Java-/XXX-Entwicklung geht das vielleicht! Was ist aber die wirkliche Grundlage der meisten unserer Anwendungen? Die Oracle Datenbank mit Datenmodell und Programmiersprache PL/SQL! Da geht das alles aber doch gar nicht! Warum eigentlich nicht? Wie geht das: agil und testgestrieben von der Anforderung bis zum Refactoring? Begeben wir uns auf unsere Reise!   3
  • 4. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Über meinen Arbeitgeber    4
  • 5. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Über mich Torsten Kleiber So ware-Architekt, Entwickler, DevOps, Administrator Kreditpla orm Seit 20 Jahren bei der IKB 23 Jahre Erfahrung PL/SQL Forms & Reports ADF SOA Mediator Architektur & Infrastruktur Fusion Middleware Development Tools Development Lifecycle    5
  • 6. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase ““ Was ist Test Driven Development (TDD)? Test-driven development (TDD) is a so ware development process that relies on the repe on of a very short development cycle: Requirements are turned into very specific test cases, then the so ware is improved so that the tests pass. This is opposed to so ware development that allows so ware to be added that is not proven to meet requirements. — Wikipedia    6.1
  • 7. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD: einfacher Zyklus    6.2
  • 8. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD: globaler Zyklus    6.3
  • 9. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD: Voraussetzungen vollständige Entwicklungsumgebung pro Entwickler inclusive Datenbank am besten lokal generische Build-, Deployment- und Test-Prozesse für Entwicklung und CI Open Mind: Entwickler muss die Methode akzep eren und leben!    6.4
  • 10. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Wie sieht meine Datenbank- Entwicklungsumgebung aus? Neben IDE’s ist in unserem Fall die Datenbank bereitzustellen. Folgende Op onen bieten sich an: seperate Schemas für jeden User in einer Datenbank nur bei 1 Applika onsschema aufwändige Applika ons-Konfigura on Grant-/Synonym-Hölle zwischen Daten- und Applika onsschemas Virtuelle Maschinen oder Docker Container rela v hohe Laufzeiten bei wiederholter Erstellung Snapshot Copies EE mit Mul tenant Op on erforderlich (> 2 Snapshot Copies) schnelle Erstellung …    7.1
  • 11. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Datenbank: Vorbereitung 1. Download (Pre-Built Developer VMs for Oracle VM VirtualBox) 2. VM impor eren und starten per GUI oder CLI: VBoxManage import %download_path%DeveloperDaysVM2019-05-31_20.ova ^ --vsys 0 --cpus 4 --memory 16384 --eula accept VBoxManage startvm "Oracle DB Developer VM" 3. Gasterweiterungen manuell einlegen und ausführen, danach Savepoint erstellen VBoxManage snapshot "Oracle DB Developer VM" take base --live 4. utPLSQL in PDB installieren curl -Lk gitreleases.dev/gh/utPLSQL/utPLSQL/latest/utPLSQL.zip -o utPLSQL.zip tar -xf utPLSQL.zip pushd utPLSQLsource sqlplus sys/oracle@//localhost/orcl as sysdba @install_headless.sql 5. Snap Shot Copy konfigurieren connect sys/oracle@//localhost/orclcdb as sysdba -- Ändern des Parameters clonedb der CDB alter system set clonedb=true scope=spfile; shutdown immediate startup -- PDB orcl nur für Lesen öffnen, da hier nur als Template genutzt alter pluggable database orcl open read only force; Database App Development VM    7.2
  • 12. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Datenbank: Snapshot Copy erzeugen / löschen 1. Pro User oder Branch wird eine neue Snapshot Copy erzeugt und je nach Anforderung der zu nutzende Servicename übergeben. 2. Das Löschen erfolgt ebenfalls über den Servicenamen. -- Anmelden an die CDB connect sys/oracle@//localhost/orclcdb as sysdba alter pluggable database &1 close; drop pluggable database &1 including datafiles; -- Anmelden an die CDB connect sys/oracle@//localhost/orclcdb as sysdba -- PDB orcl nur für Lesen öffnen, da hier nur als Template genutzt alter pluggable database orcl open read only force; create pluggable database &1 from orcl create_file_dest = '/u01/app/oracle/oradata/ORCLCDB' snapshot copy alter pluggable database &1 open;    7.3
  • 13. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase utPLSQL - Testframework für Oracle Datenbank ursprünglich von Steven Feuerstein entwickelt 2016 komple neu geschrieben und jetzt wirklich reif für den professionellen Test 100% Opensource und kostenlos unterstützt den TDD Zyklus einfach utPLSQL Name unglücklich gewählt, da nicht nur für Unit-Tests nutzbar selbst in PL/SQL geschrieben Tests sind selbst Packages alles testbar, was ich in der Datenbank machen kann orien ert sich an anderen Frameworks wie jUnit etc. zum Vergleich erwarteter und aktueller Ergebnisse arbeitet mit (Vorsicht mit Forma ern!) über PL/SQL (ut.run), CLI, SQL Developer / TOAD Plugin verschiedene für Screen, XUnit, Teamcity, Sonar und bringt mit installierbar Expecta ons und Matcher Annota onen Ausführung Reporter Code Coverage Best Prac ces   8
  • 14. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD in der Datenbank-Entwicklung Wir wollen eine einfache Annuität berechnen: Demo me →     9.1
  • 15. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neues Test Package 1. Erzeuge einen neuen Branch und pushe ihn 2. Schreibe einen neuen Test! CREATE OR REPLACE PACKAGE test_annuitaeten AS --%suite(Annuitaetenberechnung) --%test(Normale Nutzung) --%tags(unit) PROCEDURE normale_nutzung; END; / 3. Prüfe, dass der Test scheitert!    9.2
  • 16. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neuer Test Package Body 1. Schreibe die Tes mplemen erung! 2. Prüfe, dass der Test scheitert! CREATE OR REPLACE PACKAGE BODY test_annuitaeten AS PROCEDURE normale_nutzung IS BEGIN ut.expect(annuitaeten.get_annuitaet(250000, 0.05, 10)).to_equal(32376.143741364173874951668563451 END; END; /    9.3
  • 17. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Code 1. Schreibe genau so viel Code, das der Test erfolgreich ist! 2. Prüfe, dass der Test erfolgreich ist! CREATE OR REPLACE PACKAGE annuitaeten AS FUNCTION get_annuitaet ( kreditsumme IN NUMBER, zinssatz IN NUMBER, laufzeit IN NUMBER ) RETURN NUMBER; END; / CREATE OR REPLACE PACKAGE BODY annuitaeten AS FUNCTION get_annuitaet ( kreditsumme IN NUMBER, zinssatz IN NUMBER, laufzeit IN NUMBER ) RETURN NUMBER IS BEGIN RETURN kreditsumme * (((1 + zinssatz) ** laufzeit) * zinssatz) / (((1 + zinssatz) ** laufzeit) - END; END; /    9.4
  • 18. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase ““ Datenbank Design mit Liquibase One of the biggest ques ons is how to make evolu onary design work for databases. — Pramod Sadalage (Thoughtworks)    10.1
  • 19. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Liquibase: Einführung migra ons-basiertes Datenbank-Change-Management , u.a. Oracle, MySQL, SQL Server, Sybase, DB2, SQLite … : CLI, ANT, Maven, Spring … Textbasiertes Change Log File steuert die Ausführungs-Reihenfolge atomare Change Sets inline oder als Include : Eine Änderung pro Change Set Change Set Formate: deklara v: XML, YAML, JSON (generiert aus den Changes SQL für Ziel- Datenbank, teilweise inclusive Rollback) (Datenbank-spezifische Dialekte möglich) / der Datenbank mit incl. Hash Steuerung von Changesets durch vordefinierte (Datenbank, SQL Abfrageergebnis, …) Steuerung durch dem Runner mitgegebene (Testdaten nur auf Test, …) dem Runner mitgegebene können im Changeset als Variable genutzt werden (Tabelle, Spalte, …) datenbankunabhängig Runner Best Prac ce SQL Update Rollback Tracking in Datenbanktabellen Pre-Condi ons Contexts Parameter    10.2
  • 20. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Liquibase CE: Community Edition kostenlose Variante von Liquibase Viele Oracle Objekte werden durch die nicht unterstützt, z.B. PL/SQL Change Log Format SQL unterstützt komple en Sprachumfang von Datenbanken Rollback muss dann, wenn erforderlich, auch selbst in SQL geschrieben werden Reihenfolge der Ausführung wird selbst festgelegt Change Tags    10.3
  • 21. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Liquibase CE mit Community Oracle Extensions unterstützen weitere Objekte, u.a. Check-Constraints Trigger Materialized Views Disable/Enable Check-Constraints/Trigger Merge Truncate kein PL/SQL seit mehreren Jahren nicht mehr gepflegt Oracle Change Tags werden als Pro Tag erkannt und ohne Lizenz verweigert: <changeSet author="torst (generated)" id="1573059733408-39"> <ora:createTrigger ... Change Type 'pro:createTrigger' is not allowed without a valid Liquibase Pro License. Einsatz m.E. deshalb nicht zu empfehlen Oracle Extensions    10.4
  • 22. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Liquibase Professional Edition kostenpflich ge Liquibase Version von Da cal der Liquibase PRO-Version unterstützen weitere Objekte, u.a. Check-Constraints PL/SQL (Func on/Procedure, Package, Package Body) Synonyme Trigger Unused Columns keine Materialized Views kein Rollback Preis abhängig von 14 tägige verfügbar Einsatz nicht getestet Change Tags Anzahl Datenbankverbindungen Trial    10.5
  • 23. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase >_ Liquibase CE mit Oracle’s Oracle Extensions Capture von Objekten nur per SQLcl ab Version 19.2 dafür zusätzliche Tabelle DATABASECHANGELOG_EXPORT als XML Changeset über DBMS_METADATA incl. Rollback derzeit nur für angemeldeten Benutzer Reihenfolge wird automa sch erzeugt DDL Preview Modus Deployment von Objekten per SQLcl ab Version 19.2.1 per Liquibase-API’s mit oracle-liquibase.jar in in liquibase/lib/ext unterstützt Oracle Datenbank 11.2+ supportete Objek ypen Dokumenta on    10.6
  • 24. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Welche Variante nimmt man nun? Analyse über ein Legacy-System, hier das Demo-Schema HR    10.7
  • 25. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase ““ ““ ““ ““ ““ ““ ““ Liquibase ORA: Fazit Oracle’s Liquibase Extensions zeichnet Oracle-Datenmodelle und -Programme auf und kann diese auch wieder einspielen. Daten werden nicht aufgezeichnet und eingespielt. Diff nach Änderung wird nicht erzeugt. Eigenes Change Set Format, Schema nicht dokumen ert. Nutzung nur mit gebündelter Liquibase Version möglich. Die Extension hat prinzipiell Potenzial. → erste Version, später wieder anschauen!   10.8
  • 26. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase ““ ““ ““ Liquibase CE: Generieren des Legacy Change Logs Generierung leidet unter mangelnden Support von Oracle Objekten. Nacharbeiten wiegen Generierung der Objekte nicht auf. Wenn ich sowieso SQL Changesets nutzen will, weil ich nur dort alle Oracle Objekte nutzen kann, gibt es vielleicht einen anderen Weg der Generierung außerhalb von Liquibase?    10.9
  • 27. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase SQL Developer: Legacy Database Change Log (1) 1. Tools → Database Export    10.10
  • 28. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase SQL Developer: Legacy Database Change Log (2) 2. Master SQL File wird mitgeneriert 3. Mit Tastaturmakros ist daraus leicht das Database Change Log zu erzeugen Bei Triggern und PL/SQL muss der endDelimiter korrekt auf "n/s*n>|n/s*/$" gesetzt werden! (n = Zeilenumbruch, s* = beliebig viele Whitespace-Zeichen, $ = Dateiende, | = oder) -------------------------------------------------------- -- File created - Thursday-November-07-2019 -------------------------------------------------------- @X:gitde.kleiber.demos.oracle.database.tddsrcmainresourcesliquibaselb_sqldSEQUENCESDEPARTMENTS_S ... @X:gitde.kleiber.demos.oracle.database.tddsrcmainresourcesliquibaselb_sqldPROCEDURESADD_JOB_HIST ... <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:appdba="http://www.datical.n <changeSet id="0000000000000-1" author="legacy"> <sqlFile path="SEQUENCES/DEPARTMENTS_SEQ.sql" relativeToChangelogFile="true"/> </changeSet> ... <changeSet id="0000000000000-41" author="legacy"> <sqlFile path="PROCEDURES/ADD_JOB_HISTORY.sql" relativeToChangelogFile="true" endDelimiter="n/s </changeSet> ...     10.11
  • 29. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Liquibase: Sync Legacy System mit Changelog Anforderungen: Datenmodell und Daten sollen nicht geändert werden Liquibase Tabellen sollen angelegt werden Change Sets sollen als ausgeführt eingetragen werden → Alles in einem Befehl: liquibase --driver=oracle.jdbc.OracleDriver ^ --classpath="%oracle_home%ojdbc8.jar" ^ --changeLogFile=%~dp0lb_sqldcontroller.xml ^ --url="jdbc:oracle:thin:@localhost/%1" ^ --username=hr ^ --password=oracle ^ changelogSync    10.12
  • 30. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase ““ ““ ““ ““ Liquibase CE: Fazit Liquibase CE ist für Oracle nutzbar, wenn spezifische Oracle Objekte wie z.B. Check Constraints oder PL/SQL nicht genutzt werden müssen oder für diese SQL Change Sets inklusive SQL Rollback Statements erzeugt werden. Forma ed SQL Changelogs sollten nicht genutzt werden, diese sind stark bugbeha et. Sta dessen sollte der genutzt werden. Sowohl Legacy als auch Updates generell lassen sich per SQL Developer Database Export erzeugen. Change sqlFile    10.13
  • 31. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Software Development Lifecycle (SDLC) Empfehlung: Toolchain, die Branches und Pull Requests (incl. Merge) automa sch baut hier: Jenkins Mul branch Pipeline mit Github- oder Bitbucket-Repository    11.1
  • 32. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Ablauf 1. Anforderung sollte möglichst klein aber unabhängig sein 2. Branch wird nach jedem Push in Branch gebaut 3. Pull Request wird nach jedem Push in Branch oder Master gebaut 4. Beim Bauen wird der Master auf den Pull Request testweise gemerged    11.2
  • 33. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD in der Datenbank-Modellierung Die Daten weisen auf den ISO 3166-1 ALPHA-2 Code hin, aber da fehlen doch Validierungen? Demo me →    12.1
  • 34. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neuer Branch 1. Erzeuge einen neuen Branch und pushe ihn    12.2
  • 35. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neues Test Package 1. Schreibe einen neuen Test! CREATE OR REPLACE PACKAGE test_iso3166 AS --%suite(ISO 3166 Laendercodes) --%test(ALPHA-2 Code muss uppercase sein) --%throws(-02290) --%tags(model) PROCEDURE alpha2_uppercase; END; / 2. Prüfe, dass der Test scheitert!    12.3
  • 36. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neuer Test Package Body 1. Schreibe die Tes mplemen erung! CREATE OR REPLACE PACKAGE BODY test_iso3166 AS PROCEDURE alpha2_uppercase IS BEGIN INSERT INTO countries (country_id, country_name, region_id) VALUES ('xx', 'name', 1); END; END; / 2. Prüfe, dass der Test scheitert!    12.4
  • 37. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Code 1. Schreibe genau so viel Code, das der Test erfolgreich ist! ALTER TABLE "HR"."COUNTRIES" ADD CONSTRAINT "COUNTRY_ID_UPPERCASE" CHECK ( country_id = upper(country_id) ) ENABLE; 2. Prüfe, dass der Test erfolgreich ist!    12.5
  • 38. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Weiterer Test 1. Schreibe einen weiteren Test und die Implemen erung! ... --%test(ALPHA-2 Code muss zweistellig sein) --%throws(-02290) --%tags(model) PROCEDURE alpha2_zweistellig; ... PROCEDURE alpha2_zweistellig IS BEGIN INSERT INTO countries (country_id, country_name, region_id) VALUES ('X', 'name', 1); END; ... 2. Prüfe, dass der Test scheitert!    12.6
  • 39. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Code 1. Schreibe genau so viel Code, das der Test erfolgreich ist! 2. Prüfe, dass der Test erfolgreich ist! ALTER TABLE "HR"."COUNTRIES" ADD CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2" CHECK (REGEXP_LIKE(COUNTRY_ID, '^[[:alpha:]]{2}$')) ENABL    12.7
  • 40. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Refactor 1. Verbessere den Code, ohne sein Verhalten zu ändern! 2. Prüfe, dass der Test erfolgreich ist! ALTER TABLE "HR"."COUNTRIES" DROP CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2"; ALTER TABLE "HR"."COUNTRIES" ADD CONSTRAINT "COUNTRY_ID_ISO_3166_ALPHA2" CHECK (REGEXP_LIKE(COUNTRY_ID, '^[[:alpha:]]{2}$') AND CO ALTER TABLE "HR"."COUNTRIES" DROP CONSTRAINT "COUNTRY_ID_UPPERCASE";    12.8
  • 41. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Skripte erstellen, testen und versionieren (1) 1. Skripte wie gehabt aus SQL Developer erstellen 2. Testen a. Apply Changelog auf lokalen Entwicklungs-Snapshot b. Test mit SQL Developer c. Prüfen, ob alle neuen Tests erfolgreich sind    12.9
  • 42. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Skripte erstellen, testen und versionieren (2) 3. Commit    12.10
  • 43. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Branch pushen    12.11
  • 44. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase CI: Branch wird gebaut und getestet    12.12
  • 45. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Pull Request nach 1. Branch Commit erstellen    12.13
  • 46. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase CI: Pull Request wird nach jedem Push gebaut    12.14
  • 47. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase TDD in der Qualitätssicherung Braucht jede Tabelle einen Primary Key?    13.1
  • 48. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Neues Test Package 1. Erzeuge einen neuen Branch und pushe ihn 2. Schreibe einen neuen Test! CREATE OR REPLACE PACKAGE test_qa AS --%suite(Qualitaetsanalyse) --%test(Jede Tabelle muss einen Primary Key haben) --%tags(qa) PROCEDURE table_pk; END; / 3. Prüfe, dass der Test scheitert!    13.2
  • 49. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Code 1. Schreibe genau so viel Code, das der Test erfolgreich ist! 2. Prüfe, dass der Test erfolgreich ist! CREATE OR REPLACE PACKAGE BODY test_qa AS PROCEDURE table_pk IS l_expected SYS_REFCURSOR; l_actual SYS_REFCURSOR; BEGIN OPEN l_expected FOR SELECT * FROM user_tables t WHERE 0=1; OPEN l_actual FOR SELECT * FROM user_tables t WHERE NOT EXISTS ( SELECT * FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P' ); ut.expect(l_actual).to_equal(l_expected); END; END; /    13.3
  • 50. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Code 1. Schreibe genau so viel Code, das der Test erfolgreich ist! 2. Prüfe, dass der Test erfolgreich ist! CREATE OR REPLACE PACKAGE BODY test_qa AS PROCEDURE table_pk IS l_expected SYS_REFCURSOR; l_actual SYS_REFCURSOR; BEGIN OPEN l_expected FOR SELECT * FROM user_tables t WHERE 0=1; OPEN l_actual FOR SELECT * FROM user_tables t WHERE NOT EXISTS ( SELECT * FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P' ) AND t.table_name != 'DATABASECHANGELOG'; ut.expect(l_actual).to_equal(l_expected); END; END; /    13.4
  • 51. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Refactor 1. Verbessere den Code, ohne sein Verhalten zu ändern! 2. Prüfe, dass der Test erfolgreich ist! CREATE OR REPLACE PACKAGE BODY test_qa AS PROCEDURE table_pk IS l_expected SYS_REFCURSOR; l_actual SYS_REFCURSOR; BEGIN OPEN l_expected FOR SELECT t.table_name FROM user_tables t WHERE 0=1; OPEN l_actual FOR SELECT t.table_name FROM user_tables t WHERE NOT EXISTS ( SELECT 1 FROM user_constraints c WHERE c.table_name = t.table_name AND c.constraint_type = 'P' ) AND t.table_name != 'DATABASECHANGELOG'; ut.expect(l_actual).to_equal(l_expected); END; END; /    13.5
  • 52. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase weitere SDLC Schritte 1. Skripte erstellen, testen und versionieren 2. Branch pushen 3. CI: Branch wird gebaut und getestet 4. Pull Request nach 1. Branch Commit erstellen 5. CI: Pull Request wird nach jedem Push gebaut    13.6
  • 53. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Merge Pull Request    13.7
  • 54. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Branch löschen    13.8
  • 55. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Umgang mit Merge Konflikten    14.1
  • 56. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Merge Konflikt im Pull Request für Branch model    14.2
  • 57. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Merge Konflikt lösen    14.3
  • 58. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Commit Merge    14.4
  • 59. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase CI: Branch wird gebaut und getestet    14.5
  • 60. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase CI: Pull Request wird nach jedem Push gebaut    14.6
  • 61. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase weitere SDLC Schritte 1. Merge Pull Request 2. Branch löschen    14.7
  • 62. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Master Build erfolgreich incl. aller Tests/ Änderungen    14.8
  • 63. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Fazit Yes - we can agile Datenbank-Entwicklung und Modellierung! Branchen und Mergen sind möglich! Paralleles Entwickeln/Testen unter Berücksich gung von Abhängkeiten möglich! Toolchain mit Liquibase, utPLSQL, GitHub/Bitbucket, Jenkins unterstützt uns    15
  • 64. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Q&A    16
  • 65. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Referenzen , Xaver Pigeon , Johannes Ahrends, CarajanDB , Wikipedia , Pramod Sadalage, Thoughtworks , Jeff Smith, Oracle , Dokumenta on, Oracle , AskTom, Oracle Test-Driven Development: global cycle Mul tenant Snapshot Copy Annuitätendarlehen Evolu onary Database Design Liquibase and SQLcl Using Liquibase with SQLcl Primary Key    17
  • 66. Agile Oracle Datenbank-Modellierung und -EntwicklungAgile Oracle Datenbank-Modellierung und -Entwicklung @develishdevelop #APEXCONN20 #AgileOracleDatabase Referenzen , Xaver Pigeon , Johannes Ahrends, CarajanDB , Wikipedia , Pramod Sadalage, Thoughtworks , Jeff Smith, Oracle , Dokumenta on, Oracle , AskTom, Oracle Test-Driven Development: global cycle Mul tenant Snapshot Copy Annuitätendarlehen Evolu onary Database Design Liquibase and SQLcl Using Liquibase with SQLcl Primary Key    17