DJIN#86610 Problemen bij importeren DJIN/DVON dumps door ORADBA eigenaar
svn path=/Database/trunk/; revision=67268
This commit is contained in:
@@ -11,6 +11,7 @@ AS
|
||||
FUNCTION scriptspoolfile(custpattern IN VARCHAR2, scriptname IN VARCHAR2) RETURN VARCHAR2;
|
||||
FUNCTION getscriptspoolfile(scriptname IN VARCHAR2) RETURN VARCHAR2;
|
||||
FUNCTION checkscriptcust(custpattern IN VARCHAR2) RETURN VARCHAR2;
|
||||
PROCEDURE fix_mld_t_uitvoertijd;
|
||||
END adm;
|
||||
/
|
||||
|
||||
@@ -205,7 +206,57 @@ AS
|
||||
RETURN tekst;
|
||||
END;
|
||||
|
||||
END adm;
|
||||
-- Als je een database importeert onder een andere user wordt de schemanaam voor de defaults
|
||||
-- van mld_t_uitvoertijd 'bevroren' en kun je de database nooit meer onder een ander schema
|
||||
-- inlezen. In deze procedure herdefiniereren we alle default waardes zodat je de database
|
||||
-- daarna na exporteren gemakkelijk ergens anders kunt inlezen
|
||||
-- Er is niet automatisch te bepalen wanneer dit al dan niet nodig is. Daarom doen we het:
|
||||
-- * In de epiloog van een upgrade
|
||||
-- * Na anonimiseren (wat nog wel eens gebeurt vlak na een database refresh)
|
||||
PROCEDURE fix_mld_t_uitvoertijd
|
||||
IS
|
||||
--
|
||||
-- data_default is van het datatype LONG. Daarop kan geen string-bewerking als INSTR(), SUBSTR() en REPLACE() worden gedaan.
|
||||
-- Daarom moeten de benodigde gegevens eerst in een tijdelijke tabel ingelezen worden zodat het datatype VARCHAR2 wordt. Voor
|
||||
-- het huidige doel (de owner van MLD_T_UITVOERTIJD verwijderen) is de stringlengte van 1000 voldoende.
|
||||
-- Met FETCH .. BULK COLLECT INTO .. worden alle records die volgen uit de query in 1 keer opgehaald. Dit is sneller dan een fetch in een loop.
|
||||
--
|
||||
TYPE ut_row IS RECORD
|
||||
( tab_name VARCHAR2(100)
|
||||
, col_name VARCHAR2(100)
|
||||
, data_default VARCHAR2(1000)
|
||||
);
|
||||
TYPE ut_tab IS TABLE OF ut_row
|
||||
INDEX BY PLS_INTEGER;
|
||||
|
||||
qry_txt VARCHAR2(1000);
|
||||
upd_txt VARCHAR2(1000);
|
||||
l_table ut_tab;
|
||||
l_cursor SYS_REFCURSOR;
|
||||
l_pos INTEGER;
|
||||
l_default VARCHAR2(1000);
|
||||
BEGIN
|
||||
qry_txt := 'SELECT table_name, column_name, data_default'
|
||||
|| ' FROM user_tab_columns'
|
||||
|| ' WHERE data_type = ''MLD_T_UITVOERTIJD''';
|
||||
OPEN l_cursor FOR qry_txt;
|
||||
FETCH l_cursor BULK COLLECT INTO l_table;
|
||||
CLOSE l_cursor;
|
||||
|
||||
FOR indx IN 1 .. l_table.COUNT
|
||||
LOOP
|
||||
l_pos := INSTR(l_table(indx).data_default, '"."');
|
||||
IF (l_pos > 0)
|
||||
THEN
|
||||
l_default := REPLACE(REPLACE(SUBSTR(l_table(indx).data_default, l_pos+3, 100), '"', ''),'''','');
|
||||
upd_txt := 'ALTER TABLE '|| l_table(indx).tab_name ||' MODIFY '|| l_table(indx).col_name ||' DEFAULT '|| l_default;
|
||||
dbms_output.put_line(upd_txt);
|
||||
EXECUTE IMMEDIATE upd_txt;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END;
|
||||
|
||||
END adm;
|
||||
/
|
||||
|
||||
REGISTERRUN('$Id$')
|
||||
|
||||
@@ -1379,6 +1379,10 @@ CREATE OR REPLACE PACKAGE BODY ano AS
|
||||
ano.table_column('prs_perslid', 'prs_perslid_mobiel', 'telefoon');
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION (NULL);
|
||||
|
||||
// Onderstaande heeft niets met anonimiseren te maken maar anonymizefull draait nogal eens
|
||||
// na een import en dan is het altijd fijn om de mld_t_uitvoertijd te herstellen
|
||||
adm.fix_mld_t_uitvoertijd();
|
||||
END;
|
||||
|
||||
PROCEDURE anonymize (p_startdatum IN DATE,
|
||||
|
||||
@@ -20,50 +20,6 @@ DELETE
|
||||
WHERE fac_locale_kolomnaam LIKE 'FAC_IMPORT_APP_%'
|
||||
AND fac_locale_kolomkeyval NOT IN (SELECT fac_import_app_key FROM fac_import_app);
|
||||
|
||||
-- Schema-naam uit MLD_T_UITVOERTIJD verwijderen.
|
||||
--
|
||||
-- data_default is van het datatype LONG. Daarop kan geen string-bewerking als INSTR(), SUBSTR() en REPLACE() worden gedaan.
|
||||
-- Daarom moeten de benodigde gegevens eerst in een tijdelijke tabel ingelezen worden zodat het datatype VARCHAR2 wordt. Voor
|
||||
-- het huidige doel (de owner van MLD_T_UITVOERTIJD verwijderen) is de stringlengte van 1000 voldoende.
|
||||
-- Met FETCH .. BULK COLLECT INTO .. worden alle records die volgen uit de query in 1 keer opgehaald. Dit is sneller dan een fetch in een loop.
|
||||
--
|
||||
DECLARE
|
||||
TYPE ut_row IS RECORD
|
||||
( tab_name VARCHAR2(100)
|
||||
, col_name VARCHAR2(100)
|
||||
, data_default VARCHAR2(1000)
|
||||
);
|
||||
TYPE ut_tab IS TABLE OF ut_row
|
||||
INDEX BY PLS_INTEGER;
|
||||
|
||||
qry_txt VARCHAR2(1000);
|
||||
upd_txt VARCHAR2(1000);
|
||||
l_table ut_tab;
|
||||
l_cursor SYS_REFCURSOR;
|
||||
l_pos INTEGER;
|
||||
l_default VARCHAR2(1000);
|
||||
BEGIN
|
||||
qry_txt := 'SELECT table_name, column_name, data_default'
|
||||
|| ' FROM user_tab_columns'
|
||||
|| ' WHERE data_type = ''MLD_T_UITVOERTIJD''';
|
||||
OPEN l_cursor FOR qry_txt;
|
||||
FETCH l_cursor BULK COLLECT INTO l_table;
|
||||
CLOSE l_cursor;
|
||||
|
||||
FOR indx IN 1 .. l_table.COUNT
|
||||
LOOP
|
||||
l_pos := INSTR(l_table(indx).data_default, '"."');
|
||||
IF (l_pos > 0)
|
||||
THEN
|
||||
l_default := REPLACE(REPLACE(SUBSTR(l_table(indx).data_default, l_pos+3, 100), '"', ''),'''','');
|
||||
upd_txt := 'ALTER TABLE '|| l_table(indx).tab_name ||' MODIFY '|| l_table(indx).col_name ||' DEFAULT '|| l_default;
|
||||
dbms_output.put_line(upd_txt);
|
||||
EXECUTE IMMEDIATE upd_txt;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END;
|
||||
/
|
||||
|
||||
///////////////////////////// now recreate all views, triggers etc acc to the latest state ///////
|
||||
#include "recreate.inc"
|
||||
|
||||
@@ -73,6 +29,7 @@ END;
|
||||
|
||||
BEGIN
|
||||
fac.fac_cleanup;
|
||||
adm.fix_mld_t_uitvoertijd();
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user