Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Jul 012012
 

Minule jsem se zmínil, že Oracle neumožňuje tabulku véci pod rozdílnými edicemi (narozdíl od funkcí, procedur, view..). Úplná pravda je taková, že v Oracle lze mít v tabulce několik verzí řádků, ovšem není použita featura “EDITIONS”, ale je použito něco, čemu Oracle řiká Workspace, manuál zde. Je to funkcionalita o které jsem dlouho nevěděl a myslím, že je třeba si to zkusit! Co se týče workspaces v Oracle datábázi jsem byl jsem do dneška panic ;)

Workspace podporuje hiearchii (alternativně až acyklický graf,wow), názvy workspace jsou case-sensitive, maximální délka názvu workspace je 30 znaků, ale především workspace pod kterou jede aktuálně databáze se jmenuje LIVE.

Funkcinality workspaces: každé workspace může obsahovat implicitní a explicitní savepoints (místa kam lze odrolovat změny), workspace lze mergovat (hlavní funkcinalita) – samozřejmě je zde podpora řešení konfilktů.

Tabulky ve workspace mají na sobě trigger, který verzuje do tabulek s názvem <table_name>_LT z čehož plyne nějaké omezení – menší možný počet sloupců v workspacované tabulce, název tabulky může být jen 25 znaků apod. Sloupce nemohou začítnat prefixem WM_ ani WM$. Název tabulky nemůže končit surfixem _G.

Zajímavé je DDL – mimo některých omezení se DDL začinají příkazem BeginDDL a po té se i commitují příkazem CommitDDL – wow, commitování DDL.

Nad tabulkou ve workspace nejsou podporovány statement-level triggery. Materializované pohledy jen s FULL refresh.

K tabulce ve workspace vzniknou view, ty významnější jsou:

Jméno Význam
“tableName” Workspacovaná tabulka
“tableName”_LOCK Tabulka s LOCKama, při mergování workspaces
“tableName”_CONF Tabulka s conflictama při mergování
“tableName”_DIFF Rozdíl tabulky pod ruznýmí workspaces
“tableName”_HIST Historie, pokude je enabled

Celé ovládání je pomocí balíku DBMS_WM a Workspace vyžadují i nějaká ta práva (CREATE_WORKSPACE, CREATE_ANY_WORKSPACE, MERGE_WORKSPACE,FREEZE_WORKSPACE..). Zde bacha na VPD a právo MERGE_WORKSPACE.

Teorie bylo vcelku dost, tak hurá do hraní:

1) Založení usera a nagrantování mu práv

CREATE USER azor_workspace IDENTIFIED BY azor_workspace;
GRANT connect, resource, create table, merge_any_workspace,
create_any_workspace, remove_any_workspace, rollback_any_workspace to azor_workspace;
GRANT execute on dbms_wm to azor_workspace;

2) Založení tabulky pod uživatelem azor_workspace

CREATE TABLE TBL_WORKSPACE(
id number primary key,
 a  varchar2(50),
 b  varchar2(50),
 c  varchar2(50)
);

3) Založení view s historii

EXECUTE DBMS_WM.EnableVersioning ('TBL_WORKSPACE', 'VIEW_WO_OVERWRITE');

Zde to vyhučí, pokud vaše tabulka nemá primární klíč, je tedy nutný primární klíč. Příkaz zcela logicky musí založit i nějaké ty objekty, proto je dobré se před dalším krokem v příkladě z manualu ještě podívat, co že to bylo založeno:

 select * from all_objects order by created desc

A je toho hodně ! Takže to pojďme nějak rozbrat:

1) Z mé tabulky TBL_WORKSPACE je nyní VIEW 

2) V mém schématu existují dvě fyzické tabulky:

TBL_WORKSPACE_AUX -  patrně udržuje informace o verzích



TBL_WORKSPACE_LT – moje verzovaná tabulka, mimo mých sloupců ID,A,B, a C obsahuje ještě repozitorovací sloupce: VERSION, CREATETIME, RETIRETIME, NEXTVER, DELSTATUS a LTLOCK

3) Byla založená následující view: TBL_WORKSPACE_DIFF, TBL_WORKSPACE_LOCK,TBL_WORKSPACE_PKC, TBL_WORKSPACE_PKD,TBL_WORKSPACE_PKDC,TBL_WORKSPACE_PKDB, TBL_WORKSPACE_CONF,TBL_WORKSPACE_BPKC, TBL_WORKSPACE_HIST, TBL_WORKSPACE_CONS, TBL_WORKSPACE_MW a TBL_WORKSPACE_BASE, O některých se zatím dokumentace nezmiňovala.

4) Byly založeny 3 INSTEAD OF triggery nad view TBL_WORKSPACE_BASE

OVM_Delete_1, OVM_Insert_1 a OVM_Update_1, kód nejzajímavějšího z nich Update je zde: OMW_Update_1.sql

 V kódu je zajímavé použití nvl(sys_context(‘lt_ctx’, ‘state’), ‘LIVE’) z kterého je patrné, že aktuální verze workspace je uložena v contextu lt_ctx a k řízení je použito baliku wmsys.

4) Insert řádků do workspacované tabulky:

INSERT INTO TBL_WORKSPACE VALUES (1,'a1','b1','c1');
INSERT INTO TBL_WORKSPACE VALUES (2,'a2','b2','c2');
INSERT INTO TBL_WORKSPACE VALUES (3,'a3','b3','c3');
commit;

Zajímavé je flow – mnou založená tabulka TBL_WORKSPACE je nyní view, které je definováné jako select z view TBL_WORKSPACE_BASE, které je definováno jako view z tabulky TBL_WORKSPACE_LT. A tedy update/insert/delete nad TBL_WORKSPACE je nad view, které míří na view TBL_WORKSPACE_BASE na kterém jsou navěšeny již zmíněné triggery OVM_Delete_1, OVM_Insert_1 a OVM_Update_1 insertující data do fyzické tabulky TBL_WORKSPACE_LT.

Po insertu jsou záznamy v tabulce WORKSPACE_LT a mimo mých hodnot obsahují verzi (0), timestamp (systimestamp with local zone), nextver (-1), delstatus(10) a údaj o locku TLLOCK s pravzláštní hodnotou “*-1,-9,-1*$#AZOR_WORKSPACE$#”.

5) Vytvoření workspace

EXECUTE DBMS_WM.CreateWorkspace ('azor_workspace_1');

Ještě před dalším krokem jsem udělal select * from all_workspaces;  V tomto pohledu jsou dvě workspace – LIVE jako default databáze a moje azor_workspace_1 a informace o nich – kdo je parent, kdy bylo založeno, jestli je FREEZE, FREEZE_WRITER, LOCKMODES apod.

A dle manuálu založím ještě jeden:
EXECUTE DBMS_WM.CreateWorkspace ('azor_workspace_2');

6) Přepnutí do workspace  azor_workspace_1 a práce v něm

 EXECUTE DBMS_WM.GotoWorkspace ('azor_workspace_1');

A nyní nějaké ty úpravy, zcela logicky – jeden update, jeden delete, jeden insert ;)

UPDATE TBL_WORKSPACE SET a='a2_workspace_1',b='b2_workspace_1',c='c2_workspace_2' WHERE id=2;
DELETE FROM TBL_WORKSPACE WHERE id=3;
INSERT INTO TBL_WORKSPACE VALUES(4,'a4_workspace_1','b4_workspace_1','c4_workspace_1');
commit;

A nyní je hodně zajímavý pohled do repozitorovacý tabulky TBL_WORKSPACE_TL:

Workspace
Workspace

 

7) Přepnutí do workspace azor_workspace_2 a práce v něm

 EXECUTE DBMS_WM.GotoWorkspace ('azor_workspace_2');

V druhém workspace, tedy dědím řádky od roota (LIVE verze) a nevidím změny provedené ve druhém workspace:

A nyní nějaké změny:
INSERT INTO TBL_WORKSPACE VALUES(4,‘a4_workspace_2′,‘b4_workspace_2′,‘c4_workspace_2′);
– Záznam s privátním klíčem ID=4 je i v druhém workspace
INSERT INTO TBL_WORKSPACE VALUES(5,‘a5_workspace_2′,‘b5_workspace_2′,‘c5_workspace_2′);
– Záznam s ID=5 není ve druhém workspace
UPDATE TBL_WORKSPACE SET a=‘a2_workspace_2′,b=‘b2_workspace_2′,c=‘c2_workspace_2′ WHERE id=2;
– Tento záznam byl updatován v obou workspaces
DELETE FROM TBL_WORKSPACE WHERE id=3; commit;
–Tento řádek byl také smazán ve druhém workspace

7) Data – LIVE, workspace 1,2 verze a pohled do *_LT tabulky

Je čas podívat se jak vlastně nyní vypadají verze tabulek pod workspace LIVE, azor_workspace_1 a azor_workspace_2 a pochopitelně i pohled na celé repozitory ;)

Pohled na data ve všech workspace a repository
Pohled na data ve všech workspace a repository

8) Rozdíl různých workspaces

 Co dál? V balíku DBMS_WM je opravdu velká řádka funkcí, zajímavých i nezajímavých (overheady typu “RenameSavepoint”, “DropSaveopint”, které funkčnost vyžaduje, zábava však s nima není). V tomto stádiu je pro mně nezajímavější jednoznačně procedůra SetDiffVersions, která jako výsledek vrátí rozdíly mezi jednotlivými verzemi tabulek (či jejich savepointů), so ukázka:

begin
DBMS_WM.SetDiffVersions(
workspace1=>'azor_workspace_1',
workspace2=>'azor_workspace_2');
end;

Výsledek je možné vyzvednout si v pohledu _DIFF, pro mne tedy:

select * from TBL_WORKSPACE_DIFF;

*_DIFF pohled na workspace

*_DIFF pohled na workspace

A to by bylo asi pro tento článek vše. Ačkoliv s workspace budu ještě pokračovat – schválně jsem vynechal merge, protože si chci užít ještě legraci s ostatníma funkcema/procedurama než to začnu mergovat a řešit koflikty.

Workspace jsou kažodpádně hodně zajímavá funkcinalita a je zajímavé, že jsem ji vlastně ještě nikdy nikde neviděl, kromě manuálu ;) A kam dál? DBMS_WM Package: Reference.

 Posted by at 14:08

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>