giovedì 28 maggio 2015

OWM - Come verificare le differenze su una stessa tabella tra workspace diversi - parte II

Nella parte I abbiamo visto come trovare le differenze utilizzando le features del prodotto, adesso vediamo come ottenere lo stesso o quasi risultato non utilizzando le funzioni di prodotto.
Partiamo dal presupposto di dover confrontare una tabella posta nel workspace LIVE ed una posta in un workspace figlio di LIVE e di voler estrarre le differenze.

Per estrarre le differenze effettueremo delle minus tra la vista xxx_HIST filtrata per WS=LIVE e la tabella presente nel WS figlio e viceversa. Per semplificare un pò considereremo sulla tabella xxx_HIST solo che le operazioni fatte sul record devono essere diversa da DELETE. Se poi vogliamo estrarre anche i record cancellati o sul WS figlio o sul LIVE basta omettere la condizione nel filtro.

Come primo step ci posizioniamo nel WS figlio verificando che se già non ci siamo:

...
SELECT DBMS_WM.GetWorkspace  into v_get_owks FROM DUAL;

IF v_get_owks!=v_owks_child THEN
dbms_wm.GotoWorkspace(v_owks_child);
END IF;

...

 A questo punto possiamo fare la prima minus tra ciò che è presente sul LIVE e ciò che è presente nella tabella:

SELECT '||V_TAB_COLUMNS||' FROM
  (SELECT A.* ,  

          ROW_NUMBER () 
           OVER (PARTITION BY WM_workspace,'||V_PKEY_COLS||'
                 ORDER BY WM_workspace,'||V_PKEY_COLS||',
                          WM_CREATETIME DESC,  

                 NVL(WM_RETIRETIME,TO_DATE(''01019900'',''DDMMYYYY'')) DESC) RW
    FROM '||TABLE||'_HIST A)
   WHERE RW=1 AND WM_WORKSPACE=''LIVE'' AND  WM_OPTYPE<>''D'' AND (:v_where)

MINUS 
SELECT '||V_TAB_COLUMNS||' FROM '||
TABLE||' WHERE (:v_where)    

dove:
V_TAB_COLUMNS   sono le colonne della vista senza le colonne di prodotto
V_PKEY_COLS        sono le colonne della chiave della tabella  
v_where                    è una eventuale condizione di filtro comune ad entrambe le viste.

Per ottenere le differenze inverse basta invertire la minus.
Questa soluzione tuttavia risulta poco efficiente in quanto è valida solo per i confronti con il WS LIVE.
Quindi anche se possibile utilizzarla la scarterei a priori a favore della soluzione illustrata nell'articolo parte I.
Perchè ne abbiamo parlato? perchè potrebbe essere utile fare un confronto veloce col LIVE e poi avevo scritto la query...

mercoledì 27 maggio 2015

OWM - Come verificare le differenze su una stessa tabella tra workspace diversi - parte I

Quando si utilizza OWM è possibile modificare i dati di una tabella a seconda del Workspace in cui ci troviamo, se però volessimo individuare le differenze presenti in due differenti Workspace (WS) su una stessa tabella come possiamo fare?
Per rispondere a questa domanda vi sono due soluzioni, una di prodotto ed una di fantasia o meglio di tipo applicativo svincolata dal prodotto stesso.
Oggi vediamo la prima soluzione.
Se si guardano le funzioni messe a disposizione dal prodotto ne troviamo una che ci viene in aiuto, la SetDiffVersions che ci permette di abilitare la selezione sulle viste xxx_DIFF che contengono le differenze tra due differenti WS su di una tabella.
Questa funzione permette di fare la differenza tra due WS o anche tra due WS a differenti valori di SavePoints. Per abilitare la valorizzazione delle variabili del contesto che permettono la lettura delle viste xxx_DIFF occorre quindi eseguire la seguente funzione:

  1. DBMS_WM.SetDiffVersions(workspace1 IN VARCHAR2,workspace2 IN VARCHAR2);
    or
  2. DBMS_WM.SetDiffVersions(workspace1 IN VARCHAR2,savepoint1 IN VARCHAR2, workspace2 IN VARCHAR2, savepoint2 IN VARCHAR2);
Vediamo un esempio di utilizzo.
Se non effettuo alcuna chiamata alle funzioni del punto 1 o 2 nel momento in cui vado ad interrogare la vista xxx_diff questa mi risulterà vuota.




A questo punto eseguiamo la funzione 1 fornendo due WS in input.
Come si può vedere abbiamo la valorizzazione delle variabili del contesto che permettono la visualizzazione dei dati nella vista xxx_DIFF.



Se eseguiamo nuovamente la select sulla vista xxx_DIFF questa volta verrano visualizzati i dati che sono stati movimentati in entrambi i WS con l'indicazione di una terza riga che nella colonna WM_DIFFVER riporta il valore DiffBase.  Questa riga rappresenta il contenuto per quella chiave di quanto presente al momento sulla vista xxx se venisse interrogata nel WS padre dei WS di cui stiamo facendo le differenze. In questo caso essendo il LIVE il padre di entrambi i WS la riga si riferisce a ciò che è presente in quel momento sul LIVE. Logicamente i WS devono avere in comune lo stesso padre. Nel campo invece WM_CODE appare l'indicazione del tipo di operazione che quella riga ha subito nei tre differenti WS.
I valori assunti sono i seguenti:
U (updated), D (deleted), I (inserted), NC (no change), NE (nonexistent).



 Analizzando il contenuto di questa vista possiamo verificare che cosa sia cambiato tra i due WS, logicamente vengono riportati solo quei record che sono stati movimentati nei WS indicati all'inizio.
Le colonne che il prodotto aggiunge alla tabella originale nella vista sono le seguenti:



Il secondo metodo, un pò + fantasioso lo vedremo la prossima volta... se avrò tempo.