(*) IBM DB2 for z/OS DB2 Version 10 Kapitel 07: „Zeitreise“ (07_DB2V10_zeitreise.pptx) (*) ist eingetragenes Warenzeichen der IBM International Business Machines Inc. Oktober 2012 1 DB2 Version 10 - Zeitreise DB2 10 for z/OS – Im Einsatz, wo andere längst aufgeben... Oktober 2012 2 DB2 Version 10 - Zeitreise Inhalte: (7) DB2 10 auf Zeitreise: • Automatische Historisierung • Abbildung von Geschäftsvorfällen • Zeitzonen Oktober 2012 Sicherheitsadministrator, Anwendungsentwickler, Endbenutzer 3 DB2 Version 10 - Zeitreise Temporal Tables • Inhalte von Tabellen waren bislang ohne zeitlichen Zusammenhang • In V10 gibt es zwei Erweiterungen • – Pflege der Historie von Daten (SYSTEM_TIME) DB2 legt eine Historisierung von Datensätzen an – Zeitliche Spezifikation von Datensätzen (BUSINESS_TIME) Anwendung gibt die Gültigkeit von Daten zu einer bestimmten Zeit an Geschäftsvorfälle können zeitlich korrekt abgebildet werden SYSTEM_TIME und BUSINESS_TIME können kombiniert (Bi-Temporal Tables) verwendet werden Oktober 2012 4 DB2 Version 10 - Zeitreise Architektur für SYSTEM_TIME Online SQL Anwendung Aktuelle RowA RowA Jan-März Aktuelle RowB RowA März-Dez RowB Feb-April Generierung RowB April-Nov der Historie Transparenter Zugriff Auf Historie über SQL AS OF Oktober 2012 Auditing SQL Anwendung Kann direkt die Historie auslesen 5 DB2 Version 10 - Zeitreise Vereinfachte DDL für SYSTEM_TIME CREATE TABLE KFZ ( VERTRAGSNUMMER KUNDENNUMMER_ID KASKO_ID JAEHRL_FAHRLEISTUNG SYS_START CHAR(4), CHAR(4), CHAR(6), INTEGER, TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN, SYS_END TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END, CREATE_ID TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID, PERIOD SYSTEM_TIME(SYS_START, SYS_END)); CREATE TABLE KFZ_SYS_HIST ( VERTRAGSNUMMER KUNDENNUMMER_ID KASKO_ID JAEHRL_FAHRLEISTUNG SYS_START SYS_END CREATE_ID CHAR(4), CHAR(4), CHAR(6), INTEGER, TIMESTAMP(12) NOT NULL, TIMESTAMP(12) NOT NULL, TIMESTAMP(12)); ALTER TABLE KFZ ADD VERSIONING USE HISTORY TABLE KFZ_SYS_HIST; Oktober 2012 6 DB2 Version 10 - Zeitreise Beispiele für SYSTEM_TIME INSERT INTO KFZ (VERTRAGSNUMMER, KUNDENNUMMER_ID, KASKO_ID, JAEHRL_FAHRLEISTUNG) VALUES ('A123', '123', 'T150', 18000); --im Dezember 2010 Tabelle KFZ VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 T150 18000 2010-12-01 10000-01-01 UPDATE KFZ SET KASKO_ID='V300' WHERE VERTRAGSNUMMER='A123'; Tabelle KFZ VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 V300 18000 2011-03-01 10000-01-01 Automatisch gepflegte Tabelle KFZ_SYS_HIST VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ----------- ---------A123 123 T150 18000 2010-12-01 2011-03-01 UPDATE KFZ SET JAEHRL_FAHRLEISTUNG=25000 WHERE VERTRAGSNUMMER='A123'; Tabelle KFZ VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 V300 25000 2011-06-01 10000-01-01 Oktober 2012 --im März 2011 --im Juni 2011 Automatisch gepflegte Tabelle KFZ_SYS_HIST VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------------------A123 123 T150 18000 2010-12-01 2011-03-01 A123 123 V300 18000 2011-03-01 2011-06-01 7 DB2 Version 10 - Zeitreise Abfragemöglichkeiten Tabelle KFZ VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 V300 25000 2011-06-01 10000-01-01 Automatisch gepflegte Tabelle KFZ_SYS_HIST VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------------------A123 123 T150 18000 2010-12-01 2011-03-01 A123 123 V300 18000 2011-03-01 2011-06-01 SELECT * FROM KFZ WHERE VERTRAGSNUMMER='A123'; VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 V300 25000 2011-06-01 10000-01-01 SELECT * FROM KFZ FOR SYSTEM_TIME AS OF '2010-12-25' WHERE VERTRAGSNUMMER='A123'; VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 T150 18000 2010-12-01 2011-03-01 DELETE FROM KFZ WHERE VERTRAGSNUMMER='A123'; --im September 2011 SELECT * FROM KFZ FOR SYSTEM_TIME AS OF '2010-12-25' WHERE VERTRAGSNUMMER='A123'; VERTRAG KUNDE KASKO JAEHRL SYS_START SYS_END ------- ----- ------ ------ ---------- ----------A123 123 T150 18000 2010-12-01 2011-03-01 Oktober 2012 8 DB2 Version 10 - Zeitreise BUSINESS_TIME • • • • Geschäftsvorfälle zeitlich korrekt darstellen Datenmodellierung in der Vergangenheit, Gegenwart und Zukunft Bereits bei vielen Kunden manuell implementiert DB2 bietet nun eine SQL Schnittstelle Oktober 2012 9 DB2 Version 10 - Zeitreise Beispiel BUSINESS_TIME Oktober 2012 10 DB2 Version 10 - Zeitreise DB2 Tabellen Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez Kfz - Vertrag Oktober 2012 11 DB2 Version 10 - Zeitreise Anpassung des Vertrags Oktober 2012 12 DB2 Version 10 - Zeitreise Anpassung des Vertrags Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez SQL UPDATE SQL INSERT SQL INSERT Anpassung bedeutet in diesem Fall:: UPDATE INSERT der ursprünglichen Vertragsdauer : der Vertragsneuerungen Oktober 2012 INSERT eines weiteren Zeitraums mit urspr. Vertrag 13 DB2 Version 10 - Zeitreise Vereinfachte DDL für BUSINESS_TIME CREATE TABLE KFZ ( VERTRAGSNUMMER CHAR(4) KUNDENNUMMER_ID CHAR(4) KASKO_ID CHAR(6) JAEHRL_FAHRLEISTUNG INT BUS_START DATE BUS_END DATE PERIOD BUSINESS_TIME(BUS_START, BUS_END) ) NOT NOT NOT NOT NOT NOT NULL, NULL, NULL, NULL, NULL, NULL, CREATE UNIQUE INDEX IX_KFZ ON KFZ (VERTRAGSNUMMER, BUSINESS_TIME WITHOUT OVERLAPS); Oktober 2012 14 DB2 Version 10 - Zeitreise TIMESTAMP(12) • Die Genauigkeit des Timestamp wird auf 12 Stellen erweitert yyyy-mm-dd-hh.mm.ss.nnnnnnnnnn • Special Register CURRENT TIMESTAMP • JDBC Treiber arbeitet in der Regel mit TIMESTAMP(9) – • Oktober 2012 CAST nach VARCHAR möglich Achtung: Immer noch keine Sicherheit für „uniqueness“ 15 DB2 Version 10 - Zeitreise DB2 auf Zeitreise • Eine Timezone ist der Unterschied in HH:MM zwischen der lokalen Zeit und der UTC (oder früher Greenwich Mean Time GMT) • ± th:tm, where ± positives oder negatives Offset • th Stundenunterschied • tm Minutenunterschied TIMESTAMP WITH TIMEZONE – – Oktober 2012 Year-Month-Day-Hour.Minutes.Seconds time zone 2007-11-05-08.00.00-08:00 SQL • • 16 DB2 Version 10 - Zeitreise DB2 auf Zeitreise - Beispiel CREATE TABLE TABLE1 (C1 TIMESTAMP WITH TIME ZONE, C2 INTEGER); --SVL INSERT INTO TABLE1 VALUES ( '2010-08-10-08.00.00-08:00', 1); SQL –Deutschland INSERT INTO TABLE1 VALUES ( '2010-08-10-17.00.00+01:00', 2); SELECT * FROM TABLE1 WHERE C1 = '2010-08-10-17.00.00+01:00'; C1 C2 -------------------------------- -2010-08-10-08.00.00.000000-08:00 1 2010-08-10-17.00.00.000000+01:00 2 Oktober 2012 17 DB2 Version 10 - Zeitreise DB2 10 for z/OS – Im Einsatz, wo andere längst aufgeben... Oktober 2012 18