Auswahl  

Oracle Workspace Manager (Package dbms_wm) 

Oracle
DBA:PL/SQL
RDBMS 10.x
15.05.19 (MP)
15.05.19 (MP)
Workspace Manager, dbms_wm, Tabellenversionierung

Body

Der Workspace Manager dient zur Versionierung von Tabellendaten in verschieden Versionen (Workspaces)
Vorteile
  • Langlaufende Transaktionen können in einem eigenen Workspace laufen, ohne dass sie andere Sessions behindern
  • Unterschiedliche Versionsstände einer Tabelle können unendlich lange gespeichert werden
  • Was wäre, wenn Analysen in beliebiger Anzahl durchgeführt werden, ohne dass die Produktionsdaten dadurch verändert werden?
  • Verfügbar in Standard und Enterprise Edition
Vorbereitungen:
  • Tabellen müssen für den Workspace vorbereitet werden (DBMS_WM.EnableVersioning)
  • Dadurch wird die Tabelle umbenannt in <tabellenname>_LT
  • Dann wird eine View erzeugt mit dem Ursprungsnamen der Tabelle
  • Auf die View wird ein Instead of Trigger gelegt, der die Daten dann wieder in die Tabelle einträgt
  • Der Tablespace für die Tabelle wird nicht gewechselt
Sie können eine Administrationsrolle mit allen Rechten für die Workspacebearbeitung vergeben:
GRANT WM_ADMIN_ROLE TO <user>;

Folgende Einzelrechte können vergeben werden:
  • ACCESS_WORKSPACE
  • CREATE_WORKSPACE
  • MERGE_WORKSPACE
  • REMOVE_WORKSPACE
  • ROLLBACK_WORKSPACE
  • FREEZE_WORKSPACE
Beispiel:
BEGIN
DBMS_WM.GrantWorkspacePriv('ACCESS_ANY_WORKSPACE, MERGE_ANY_WORKSPACE', 'my_workspace_1','SCOTT','NO');
END;

/

Folgendes gilt für die Tabellen:
  • Nur der Eigentümer oder der Inhaber des Rechts WM_ADMIN_ROLE kann die Versionierung aktivieren
  • Die Tabelle muss einen Primärschlüssel besitzen
  • SYS Tabellen können nicht versioniert werden
  • Wenn eine Parent Tabelle versioniert wurde, muss die Child Tabelle es auch sein
  • Aber eine Child Tabelle kann auch ohne Parent Tabelle versioniert werden
  • Foreign Key Constraints dürfen nach Aktivieren der Versionierung nicht mehr nachträglich erzeugt werden
Beispiel:
Tabelle für den Workspace Manager aktivieren:
BEGIN
DBMS_WM.EnableVersioning(Table_Name => 'emp');
END;
/

Zwei Workspaces einrichten:
EXECUTE DBMS_WM.CreateWorkspace('my_workspace_1');

In den ersten Workspace wechseln:
EXECUTE DBMS_WM.GotoWorkspace('my_workspace_1');

Durchführen von Änderungen in der Tabelle emp im Workspace my_workspace_1:
INSERT INTO emp (empno,ename,deptno) VALUES (8000,'Marco',40);
DELETE FROM emp WHERE deptno=10;
UPDATE emp SET sal=sal+1 WHERE deptno=20;

In den Haupt-Workspace wechseln:
EXECUTE DBMS_WM.GotoWorkspace('LIVE');
Dort ist die Tabelle in Ihrem Ursprungszustand zu sehen (ohne die 3 DML Änderungen)

In welchem Workspace sind wir gerade?
SELECT DBMS_WM.GetWorkspace FROM dual;

Die Live Tabelle kann nun auf die Workspace Tabellen-Variante refreshed werden:
BEGIN
DBMS_WM.RefreshWorkspace(
workspace =>'my_workspace_1');
END;
/
Oder die Workspace Variante wird auf Live synchronisiert:
BEGIN
DBMS_WM.MergeWorkspace(
workspace =>'my_workspace_1');
END;
/

Die Tabelle kann wieder aus der Versionsverwaltung herausgenommen werden durch:
EXEC DBMS_WM.DisableVersioning('SCOTT.EMP');
Mit der Option FORCE wird das Kommando auch mit geänderten Workspacedaten durchgeführt, sonst erhält man einen Oracle Fehler:
ORA-20038: cannot disable version a table modified in non-LIVE workspaces

BEGIN
DBMS_WM.DisableVersioning('SCOTT.EMP',force=>TRUE);
END;
/

Zum Löschen eines Workspace verwenden Sie:
BEGIN
DBMS_WM.RemoveWorkspace('my_workspace_1');
END;
/

Weitere Informationen zum Workspace Manager erhalten Sie in unserem PL/SQL II Kurs
 

Besuchen Sie uns doch bei einer unsere über 40 Oracle Schulungen in München - Unterhaching.