Bei FastChangeCo entwerfen die Datenmodellierer des Data Management Center of Excellence (DMCE) Teams zum Speichern von Daten immer wieder neue Datenbankobjekte. Eine der Datenmodelliererinnen im Team ist Xuefang Kaya. Wenn sie eine neue User Story/Aufgabe übernimmt, modelliert sie in der Regel mehrere Tabellen, deren Spalten und legt einen Datentyp für jede Spalte fest.
Wenn z. B. eine Spalte den Zeitstempel für ein Ereignis speichern muss, legt Xuefang für diese Spalte den Datentyp Datum/Zeit (in dem Fall sogar jeweils abhängig von der Datenbank) fest. Wenn zusätzliche Spalten Namen und Adressen speichern sollen, stellt sie die Spalten auf den Datentyp Text ein.
Im PowerDesigner den Standardwert ändern
Für eine neue Tabelle ‘Student’, zur Erfassung der im Team arbeitenden Studenten (ja, ich weiß, ein olles Beispiel), möchte Xuefang im Datenbankentwurf für die Spalte ‘Inserted At’ einen sogenannten Standardwert festlegen. Ein Standardwert kann der Rückgabewert einer Funktion (z. B. DB_NAME() im Microsoft SQL Server) oder eine Konstante (z. B. Der Text “Wert ist nicht definiert”) sein.
So kann, obwohl die Spalte ‘Inserted At’ (mit dem festgelegten Standardwert) im Insert-Statement (DML) nicht angegeben ist, der festgelegte Standardwert automatisch eingefügt werden. Typische Beispiele in bisherigen Umsetzungen des DMCE-Teams sind Zeitstempel oder die Nutzernamen, um zu dokumentieren wer wann die Daten in die Tabelle eingefügt habt.
In der vorliegenden Tabelle ‘Student’ geht es darum, den UTC-Zeitstempel zu jedem Datensatz in der Spalte ‘InsertedAt’ automatische hinzuzufügen. Im zu erstellenden Datenbankdesign für den Microsoft SQL Server möchte Xuefang dafür den ‘Standardwert’ SYSUTCDATIME() verwenden. Xuefang weiß, dass es im PowerDesigner möglich ist, beim Entwerfen einer Spalte einen Standardwert auszuwählen.
Allerdings stellt Xuefang schnell fest, dass es den benötigten Datentyp SYSUTCDATIME() nicht zur Auswahl gibt.
Als eine naheliegende Lösung für dieses Problem erstellt Xuefang den fehlenden Standard-Datentyp im PowerDesigner als eine ‘Default Property’.
Auf den ersten Blick sah das nach einer guten und einfache Lösung für diese Anforderung aus. Allerdings stellt Xuefang schnell fest, dass dieses Vorgehen in diesem Fall mehr Nachteile als gedacht hat:
- Der Standard-Datentyp ist nicht ohne weiteres in allen Datenmodellen des DMCE verfügbar. Nur als Default Property im aktuellen Datenmodell.
- PowerDesigner legt die Funktion SYSUTCDATIME() im Standard-Datenbankobjekt (CREATE DEFAULT) als Textkonstante an, nicht als Funktion. Das führt dazu, dass der Text ‘SYSUTCDATIME()’ (inkl. der Apostrophe) eingefügt wird und nicht der aktuelle UTC Zeitstempel.
- Das Datenbankobjekt, das mit dem DDL CREATE DEFAULT angelegt wird, ist veraltet und in einer zukünftigen Version des Microsoft SQL Server entfernt (CREATE DEFAULT (Transact-SQL) - SQL Server | Microsoft Docs).
Das sind für Xuefang und das DMCE-Team zu viele mögliche Fehlerquellen. Eine andere Lösung muss gefunden werden. Nach einigem Suchen findet Xuefang in der PowerDesigner Hilfe zum Punkt Defaultwert einer Spalte eine Eintrag, der vielversprechend ist:
Default - The value assigned in the absence of an expressly entered value. For the PDM, you can directly enter a default value or select a keyword (defined in the Script\Sql\Keywords\ReservedDefault entry of the DBMS definition file) from the list. Default objects (see Defaults (PDM)) are also available for selection if your DBMS supports them.
Bevor ihr hier weiter macht, lest euch unbedingt den Blogpost DBMS-Ressourcendatei dazu durch! Dieser ist die Basis für das weitere Vorgehen.
“Super”, sagt sich Xuefang. Das machen wir so. Das DMCE-Team hatte bereits Anpassungen an der RDBMS-Ressourcendatei vorgenommen. Diese extra dafür erstellte RDBMS-Ressourcendatei ist jetzt nach den Wünschen und Bedürfnissen anpassbar. Xuefang kann damit zwei der oben genannten Nachteile lösen. Die Datei wird bereits über das Git-Repository im DMCE-Team verteilt und in allen Datenmodellen verwendet. So wäre die Anpassung sofort für alle verfügbar.
Im PowerDesigner einen neuen Standardwert hinzufügen
“OK, dann werde ich das so umsetzen.” Dazu öffnet sie im PowerDesigner den Dialog DBMS Properties über das Menu Database -> Edit Current DBMS…
Und fügt in der Sektion ReservedDefault die Funktion SYSUTCDATETIME() hinzu.
Nach dem Speichern kann Xuefang den neuen Defaultwert in den Eigenschaften der Spalte ‘Inserted At’ auswählen.
Nachdem alle Tests erfolgreich abgeschlossen sind, freut sich das DMCE-Team, dass es am Ende eine einfache Lösung für eine lästige Unannehmlichkeit gefunden hat.
Das DMCE-Team ist so von diesem Vorgehen angetan, dass es auf diese Art und Weise noch mehr der Probleme, Unannehmlichkeiten und Fehler bei der Erzeugung der DDL-Dateien mit dem PowerDesigner beheben möchte.
Aber das ist eine andere Geschichte. Mehr darüber im nächsten Artikel der Serie. Ihr müsst unbedingt wieder vorbeischauen.
So long
Euer Dirk
Zurück zur PowerDesigner Serie: PowerDesigner Serie