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.