#ifdef MLD /* * $Revision$ * $Id$ */ #undef TRUNC CREATE OR REPLACE PACKAGE ano AS PROCEDURE anonymizebes (p_startdatum IN DATE, p_einddatum IN DATE); PROCEDURE anonymizebez (p_startdatum IN DATE, p_einddatum IN DATE); PROCEDURE anonymizemld (p_startdatum IN DATE, p_einddatum IN DATE); PROCEDURE anonymizeprs (p_startdatum IN DATE, p_einddatum IN DATE); PROCEDURE anonymizefull(p_flags NUMBER DEFAULT 65535); PROCEDURE anonymize (p_startdatum IN DATE, p_einddatum IN DATE); PROCEDURE table_column(p_tabel IN VARCHAR2, p_kolom IN VARCHAR2, p_functie IN VARCHAR2); FUNCTION postcode(postcode_veld IN VARCHAR2) RETURN VARCHAR2; FUNCTION telefoon(telefoon_veld IN VARCHAR2) RETURN VARCHAR2; FUNCTION adres(adres_veld IN VARCHAR2) RETURN VARCHAR2; FUNCTION naam(naam_veld IN VARCHAR2, uniek IN NUMBER DEFAULT 0) RETURN VARCHAR2; FUNCTION email(email_veld IN VARCHAR2) RETURN VARCHAR2; FUNCTION memo(memo_veld IN VARCHAR2) RETURN VARCHAR2; FUNCTION generic(veld IN VARCHAR2, fmt IN NUMBER DEFAULT 0) RETURN VARCHAR2; END ano; / CREATE OR REPLACE PACKAGE BODY ano AS PROCEDURE anonymizebes (p_startdatum IN DATE, p_einddatum IN DATE) AS anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period')); v_count NUMBER; -- Alle bestellingen waarvan de afwijsdatum, alles geleverd datum, verwerkingsdatum of annuleringsdatum tussen de startdatum en de einddatum liggen. CURSOR c_bestelling IS SELECT b.bes_bestelling_key FROM bes_bestelling b WHERE (SELECT MAX(ft.fac_tracking_datum) FROM fac_tracking ft WHERE ft.fac_tracking_refkey = b.bes_bestelling_key AND ft.fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bestelling' --AND fac_srtnotificatie_code != 'BESANO' -- Vervangen door "fac_srtnotificatie_key != key" hieronder. Blijkt veel sneller te zijn. AND fac_srtnotificatie_key != (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'BESANO') )) BETWEEN p_startdatum AND p_einddatum AND b.bes_bestelling_status IN (1, 6, 7, 8) AND NOT EXISTS (SELECT ft.fac_tracking_key FROM fac_tracking ft WHERE ft.fac_tracking_refkey = b.bes_bestelling_key AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'BESANO')) ORDER BY b.bes_bestelling_key; BEGIN IF p_einddatum > SYSDATE - anonymize_period + 1 THEN raise_application_error(-20001, 'ano_m001 Einddatum is te groot'); END IF; v_count := 0; FOR rec_b IN c_bestelling LOOP -- Verwijder alle kenmerkwaarden van de bestelling waarvan het &8 (BITAND) bit van het bes_srtkenmerk.bes_srtkenmerk_systeem veld is gezet. DELETE FROM bes_kenmerkbestell bkbl WHERE bkbl.bes_bestelling_key = rec_b.bes_bestelling_key AND bkbl.bes_kenmerk_key IN (SELECT bk.bes_kenmerk_key FROM bes_kenmerk bk, bes_srtkenmerk bsk WHERE bk.bes_srtkenmerk_key = bsk.bes_srtkenmerk_key AND bk.bes_kenmerk_key = bkbl.bes_kenmerk_key AND BITAND(bsk.bes_srtkenmerk_systeem, 8) = 8); -- Verwijder alle kenmerkwaarden van de bestelopdrachten van de bestelling waarvan het &8 (BITAND) bit van het bes_srtkenmerk.bes_srtkenmerk_systeem veld is gezet. DELETE FROM bes_kenmerkbesteli bkbi WHERE bkbi.bes_bestelling_item_key IN (SELECT bi.bes_bestelling_item_key FROM bes_bestelling_item bi WHERE bi.bes_bestelling_key = rec_b.bes_bestelling_key) AND bkbi.bes_kenmerk_key IN (SELECT bk.bes_kenmerk_key FROM bes_kenmerk bk, bes_srtkenmerk bsk WHERE bk.bes_srtkenmerk_key = bsk.bes_srtkenmerk_key AND bk.bes_kenmerk_key = bkbi.bes_kenmerk_key AND BITAND(bsk.bes_srtkenmerk_systeem, 8) = 8); -- Alle BES tracking anonimiseren m.b.t. de bestelling. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bestelling' AND fac_srtnotificatie_code != 'BESANO') AND fac_tracking_refkey = rec_b.bes_bestelling_key AND fac_tracking_oms IS NOT NULL; -- Anonimiseren van de bestelling tracken. fac.trackaction('BESANO', rec_b.bes_bestelling_key, NULL, NULL, NULL); -- Anonimiseren bestelopdrachten. FOR rec_bo IN (SELECT bo.bes_bestelopdr_key FROM bes_bestelopdr bo, bes_bestelopdr_item boi, bes_bestelling_item bi WHERE bo.bes_bestelopdr_key = boi.bes_bestelopdr_key AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = rec_b.bes_bestelling_key) LOOP -- Alle BES tracking anonimiseren m.b.t. de bestelopdracht van de bestelling. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bestelopdr' AND fac_srtnotificatie_code != 'BES2AN') AND fac_tracking_refkey = rec_bo.bes_bestelopdr_key AND fac_tracking_oms IS NOT NULL; -- Anonimiseren van de bestelopdracht tracken. fac.trackaction('BES2AN', rec_bo.bes_bestelopdr_key, NULL, NULL, NULL); END LOOP; IF v_count >= 1000 THEN COMMIT; v_count := 0; ELSE v_count := v_count + 1; END IF; END LOOP; END; PROCEDURE anonymizebez (p_startdatum IN DATE, p_einddatum IN DATE) AS anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period')); bez_generic_visitor VARCHAR2 (2001) := lcl.l('lcl_bez_generic_visitor'); v_count NUMBER; -- Alle afspraken die tussen de startdatum en de einddatum liggen. CURSOR c_afspraak IS SELECT bez_afspraak_key FROM bez_afspraak WHERE bez_afspraak_eind BETWEEN p_startdatum AND p_einddatum AND NOT EXISTS (SELECT ft.fac_tracking_key FROM fac_tracking ft WHERE ft.fac_tracking_refkey = bez_afspraak_key AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'BEZANO')) ORDER BY bez_afspraak_key; BEGIN IF p_einddatum > SYSDATE - anonymize_period + 1 THEN raise_application_error(-20001, 'ano_m001 Einddatum is te groot'); END IF; v_count := 0; FOR rec IN c_afspraak LOOP -- Verwijder alle kenmerkwaarden van bezoekers van de afspraak waarvan het &8 (BITAND) bit van het bez_kenmerk.bez_kenmerk_systeem veld is gezet. DELETE FROM bez_kenmerkwaarde bkw WHERE bkw.bez_bezoekers_key IN (SELECT b.bez_bezoekers_key FROM bez_bezoekers b WHERE b.bez_afspraak_key = rec.bez_afspraak_key) AND bkw.bez_kenmerk_key IN (SELECT bk.bez_kenmerk_key FROM bez_kenmerk bk WHERE bk.bez_kenmerk_key = bkw.bez_kenmerk_key AND BITAND(bk.bez_kenmerk_systeem, 8) = 8); -- Anonimiseer alle bezoekers. UPDATE bez_bezoekers SET bez_afspraak_naam = bez_generic_visitor, bez_afspraak_bedrijf = NULL, bez_afspraak_opmerking = NULL, bez_bezoekers_telefoon = NULL, bez_bezoekers_email = NULL, bez_bezoekers_kenteken = NULL WHERE bez_afspraak_key = rec.bez_afspraak_key; -- Anonimiseer alle afspraken. -- Door de trigger in de update wordt automatische de naam van de host in de gastheer geplakt. -- Daardoor wordt de lcl "Ganonimiseerd" in vele gevallen niet blijvend in de gasheer gezet. -- De persoon (prs record) moet daarom eerst aangepast worden. -- Tijdens het anonimiseren van de persoon wordt daarom de bez_afspraak_gastheer ook geanonimiseerd. -- In de gevallen dat er geen host wordt gebruikt en alleen tekst voor de persoon (gastheer) wordt ingevuld wordt het veld wel blijvend gezet. UPDATE bez_afspraak SET bez_afspraak_gastheer = bez_generic_visitor, bez_afspraak_telefoonnr = NULL, bez_afspraak_opmerking = NULL WHERE bez_afspraak_key = rec.bez_afspraak_key; -- Alle BEZ tracking anonimiseren m.b.t. de afspraak. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'afspraak' AND fac_srtnotificatie_code != 'BEZANO') AND fac_tracking_refkey = rec.bez_afspraak_key AND fac_tracking_oms IS NOT NULL; -- Alle BEZ tracking anonimiseren m.b.t. de bezoekers van de afspraak. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bezoeker') AND fac_tracking_refkey IN (SELECT bb.bez_bezoekers_key FROM bez_bezoekers bb WHERE bb.bez_afspraak_key = rec.bez_afspraak_key) AND fac_tracking_oms IS NOT NULL; -- Anonimiseren van de afspraak tracken. fac.trackaction('BEZANO', rec.bez_afspraak_key, NULL, NULL, NULL); IF v_count >= 1000 THEN COMMIT; v_count := 0; ELSE v_count := v_count + 1; END IF; END LOOP; END; PROCEDURE anonymizemld (p_startdatum IN DATE, p_einddatum IN DATE) AS anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period')); v_count NUMBER; -- Alle meldingen waarvan de afwijsdatum of verwerkingsdatum tussen de startdatum en de einddatum liggen. CURSOR c_melding IS SELECT m.mld_melding_key FROM mld_melding m WHERE (SELECT MAX(ft.fac_tracking_datum) FROM fac_tracking ft WHERE ft.fac_tracking_refkey = m.mld_melding_key AND ft.fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'melding' --AND fac_srtnotificatie_code != 'MLDANO' -- Vervangen door "fac_srtnotificatie_key != key" hieronder. Blijkt veel sneller te zijn. AND fac_srtnotificatie_key != (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'MLDANO') )) BETWEEN p_startdatum AND p_einddatum AND m.mld_melding_status IN (1, 6) AND NOT EXISTS (SELECT ft.fac_tracking_key FROM fac_tracking ft WHERE ft.fac_tracking_refkey = m.mld_melding_key AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'MLDANO')) ORDER BY m.mld_melding_key; BEGIN IF p_einddatum > SYSDATE - anonymize_period + 1 THEN raise_application_error(-20001, 'ano_m001 Einddatum is te groot'); END IF; v_count := 0; FOR rec_m IN c_melding LOOP -- Verwijder alle kenmerkwaarden van de melding waarvan het &8 (BITAND) bit van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet. DELETE FROM mld_kenmerkmelding mkm WHERE mkm.mld_melding_key = rec_m.mld_melding_key AND mkm.mld_kenmerk_key IN (SELECT mk.mld_kenmerk_key FROM mld_kenmerk mk, mld_srtkenmerk msk WHERE mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key AND mk.mld_kenmerk_key = mkm.mld_kenmerk_key AND BITAND(msk.mld_srtkenmerk_systeem, 8) = 8); -- Verwijder alle kenmerkwaarden van de opdrachten van de melding waarvan het &8 (BITAND) bit van het mld_srtkenmerk.mld_srtkenmerk_systeem veld is gezet. DELETE FROM mld_kenmerkopdr mko WHERE mko.mld_opdr_key IN (SELECT mo.mld_opdr_key FROM mld_opdr mo WHERE mo.mld_melding_key = rec_m.mld_melding_key) AND mko.mld_kenmerk_key IN (SELECT mk.mld_kenmerk_key FROM mld_kenmerk mk, mld_srtkenmerk msk WHERE mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key AND mk.mld_kenmerk_key = mko.mld_kenmerk_key AND BITAND(msk.mld_srtkenmerk_systeem, 8) = 8); -- Alle MLD tracking anonimiseren m.b.t. de melding. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'melding' AND fac_srtnotificatie_code != 'MLDANO') AND fac_tracking_refkey = rec_m.mld_melding_key AND fac_tracking_oms IS NOT NULL; -- Anonimiseren van de melding tracken. fac.trackaction('MLDANO', rec_m.mld_melding_key, NULL, NULL, NULL); -- Anonimiseren opdrachten melding. FOR rec_o IN (SELECT mld_opdr_key FROM mld_opdr WHERE mld_melding_key = rec_m.mld_melding_key) LOOP -- Alle MLD tracking anonimiseren m.b.t. de opdrachten van de melding. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'opdracht' AND fac_srtnotificatie_code != 'ORDANO') AND fac_tracking_refkey = rec_o.mld_opdr_key AND fac_tracking_oms IS NOT NULL; -- Anonimiseren van de meldingsopdracht tracken. fac.trackaction('ORDANO', rec_o.mld_opdr_key, NULL, NULL, NULL); END LOOP; IF v_count >= 1000 THEN COMMIT; v_count := 0; ELSE v_count := v_count + 1; END IF; END LOOP; END; PROCEDURE anonymizeprs (p_startdatum IN DATE, p_einddatum IN DATE) AS anonymize_period NUMBER := fac.safe_to_number (fac.getsetting ('anonymize_period')); bez_generic_visitor VARCHAR2 (2001) := lcl.l('lcl_bez_generic_visitor'); prs_old_employee VARCHAR2 (100) := lcl.l('lcl_prs_old_employee'); v_count NUMBER; -- Alle personen die tussen de startdatum en de einddatum verwijderd zijn. CURSOR c_perslid IS SELECT '[' || TO_CHAR (p.prs_perslid_key) || '|' || p.prs_perslid_naam || '|' || p.prs_perslid_email || '] ' aanduiding, p.prs_perslid_key FROM prs_perslid p WHERE p.prs_perslid_verwijder IS NOT NULL AND p.prs_perslid_verwijder BETWEEN p_startdatum AND p_einddatum AND NOT EXISTS (SELECT ft.fac_tracking_key FROM fac_tracking ft WHERE ft.fac_tracking_refkey = p.prs_perslid_key AND ft.fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'PRSANO')) ORDER BY 2; BEGIN IF p_einddatum > SYSDATE - anonymize_period + 1 THEN raise_application_error(-20001, 'ano_m001 Einddatum is te groot'); END IF; v_count := 0; FOR rec IN c_perslid LOOP BEGIN -- Verwijder alle kenmerkwaarden van de persoon waarvan het &8 (BITAND) bit van het prs_kenmerk.prs_kenmerk_systeem veld is gezet. DELETE FROM prs_kenmerklink pkl WHERE pkl.prs_kenmerklink_niveau = 'P' AND pkl.prs_link_key = rec.prs_perslid_key AND pkl.prs_kenmerk_key IN (SELECT pk.prs_kenmerk_key FROM prs_kenmerk pk WHERE pk.prs_kenmerk_key = pkl.prs_kenmerk_key AND BITAND(pk.prs_kenmerk_systeem, 8) = 8); -- Persoon anonimiseren. UPDATE prs_perslid SET prs_perslid_naam = prs_old_employee, prs_perslid_tussenvoegsel = NULL, prs_perslid_voorletters = NULL, prs_perslid_voornaam = NULL, prs_perslid_titel = NULL, prs_perslid_initialen = NULL, prs_perslid_geslacht = NULL, prs_perslid_nr = NULL, prs_perslid_telefoonnr = NULL, prs_perslid_mobiel = NULL, prs_perslid_email = NULL, prs_perslid_oslogin = NULL, prs_perslid_oslogin2 = NULL, prs_perslid_uurloon = NULL, alg_onroerendgoed_keys = NULL, alg_onroerendgoed_type = NULL WHERE prs_perslid_key = rec.prs_perslid_key; -- Van al zijn afspraken waar hij host was, ook de naam van de host (=veld gastheer) anonimiseren. -- Door update gebeurd dit eigenlijk al automatisch maar dan moet de persoon al wel eerst geanonimiseerd zijn. UPDATE bez_afspraak SET bez_afspraak_gastheer = bez_generic_visitor WHERE bez_afspraak_host_key = rec.prs_perslid_key; -- Alle PRSXXX tracking anonimiseren. De PRSLOG tracking moet verwijderd worden. UPDATE fac_tracking SET fac_tracking_oms = NULL WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code LIKE 'PRS%' AND fac_srtnotificatie_code != 'PRSLOG' AND fac_srtnotificatie_code != 'PRSANO') AND fac_tracking_refkey = rec.prs_perslid_key AND fac_tracking_oms IS NOT NULL; -- PRSLOG Tracking verwijderen. DELETE FROM fac_tracking WHERE fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'PRSLOG') AND fac_tracking_refkey = rec.prs_perslid_key; -- Anonimiseren van de persoon tracken. fac.trackaction('PRSANO', rec.prs_perslid_key, NULL, NULL, NULL); IF v_count >= 1000 THEN COMMIT; v_count := 0; ELSE v_count := v_count + 1; END IF; END; END LOOP; END; PROCEDURE anonymizefull(p_flags NUMBER DEFAULT 65535) AS BEGIN -- Destructive obstrufication of personal data. UPDATE prs_perslid SET prs_perslid_naam = INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_naam))) WHERE prs_perslid_naam NOT LIKE 'INACTIEF:%' AND prs_perslid_naam NOT LIKE 'Facilitor' AND (prs_perslid_oslogin IS NULL OR SUBSTR(prs_perslid_oslogin, 1, 1) <> '_'); UPDATE prs_perslid SET prs_perslid_voornaam = INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_voornaam))) WHERE prs_perslid_voornaam IS NOT NULL AND (prs_perslid_oslogin IS NULL OR SUBSTR(prs_perslid_oslogin, 1, 1) <> '_'); UPDATE prs_perslid SET prs_perslid_voorletters = UPPER( SUBSTR(prs_perslid_voorletters,1,1) || REGEXP_REPLACE(SUBSTR(prs_perslid_voorletters, 2), '[A-Z]', DBMS_RANDOM.string('l',1)) ) WHERE prs_perslid_voorletters IS NOT NULL; UPDATE prs_perslid SET prs_perslid_naam = 'INACTIEF:' || INITCAP (DBMS_RANDOM.string ('l', LENGTH (prs_perslid_naam) - 9)) WHERE prs_perslid_naam LIKE 'INACTIEF:%'; UPDATE prs_perslid SET prs_perslid_email = 'P' || TO_CHAR(prs_perslid_key) || '@notexist.facilitor.nl' WHERE prs_perslid_email IS NOT NULL; UPDATE prs_perslid SET prs_perslid_oslogin2='O' || TO_CHAR(prs_perslid_key) WHERE prs_perslid_oslogin2 IS NOT NULL; UPDATE prs_perslid SET prs_perslid_wachtwoord_hash = null; UPDATE prs_perslid SET prs_perslid_apikey = 'TEST_' || dbms_utility.get_hash_value(prs_perslid_apikey , 0, power(2,24)) WHERE prs_perslid_apikey IS NOT NULL; DELETE FROM fac_imp_perslid; -- Indien mogelijk de naam van contactpersoon overnemen van prs_perslid. UPDATE prs_contactpersoon cp SET prs_contactpersoon_naam = ( SELECT CASE WHEN c.prs_perslid_key IS NULL THEN UPPER(SUBSTR(c.prs_contactpersoon_naam,1,1)) || DBMS_RANDOM.string('l', LENGTH(c.prs_contactpersoon_naam) -1) ELSE SUBSTR(p.prs_perslid_naam, 1, 30) END FROM prs_contactpersoon c , prs_perslid p WHERE c.prs_perslid_key = p.prs_perslid_key(+) AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key ); UPDATE prs_contactpersoon cp SET cp.prs_contactpersoon_voornaam = ( SELECT CASE WHEN c.prs_perslid_key IS NULL THEN UPPER(SUBSTR(c.prs_contactpersoon_voornaam,1,1) || DBMS_RANDOM.string('l', LENGTH(c.prs_contactpersoon_voornaam) -1)) ELSE p.prs_perslid_voornaam END FROM prs_contactpersoon c , prs_perslid p WHERE c.prs_perslid_key = p.prs_perslid_key(+) AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key ) WHERE prs_contactpersoon_voornaam IS NOT NULL; UPDATE prs_contactpersoon cp SET prs_contactpersoon_voorletters = ( SELECT CASE WHEN c.prs_perslid_key IS NULL THEN UPPER(SUBSTR(c.prs_contactpersoon_voornaam,1,1) || REGEXP_REPLACE(SUBSTR(c.prs_contactpersoon_voorletters,2),'[A-Z]', DBMS_RANDOM.string('l',1))) ELSE SUBSTR(p.prs_perslid_voorletters, 1, 15) END FROM prs_contactpersoon c , prs_perslid p WHERE c.prs_perslid_key = p.prs_perslid_key(+) AND c.prs_contactpersoon_key = cp.prs_contactpersoon_key ) WHERE prs_contactpersoon_voorletters IS NOT NULL; UPDATE prs_contactpersoon SET prs_contactpersoon_email= 'EC' || TO_CHAR(prs_contactpersoon_key) || '@notexist.facilitor.nl' WHERE prs_contactpersoon_email IS NOT NULL; EXECUTE IMMEDIATE 'ALTER TRIGGER bez_t_bez_afspraak_B_IU DISABLE'; UPDATE bez_afspraak SET bez_afspraak_gastheer = (SELECT SUBSTR(prs_perslid_naam_full,1,50) FROM prs_v_perslid_fullnames_all WHERE prs_perslid_key = bez_afspraak_host_key ) WHERE bez_afspraak_host_key IS NOT NULL; UPDATE bez_afspraak SET bez_afspraak_gastheer = INITCAP (DBMS_RANDOM.string ('l', LENGTH (bez_afspraak_gastheer))) WHERE bez_afspraak_host_key IS NULL; EXECUTE IMMEDIATE 'ALTER TRIGGER bez_t_bez_afspraak_B_IU ENABLE'; UPDATE bez_bezoekers SET bez_afspraak_naam = UPPER(SUBSTR(bez_afspraak_naam,1,1)) || '. Bezoeker' WHERE bez_afspraak_naam IS NOT NULL AND bez_afspraak_naam <> 'Anoniem'; UPDATE bez_bezoekers SET bez_afspraak_bedrijf = UPPER(SUBSTR(bez_afspraak_bedrijf,1,1)) || 'areon B.V.' WHERE bez_afspraak_bedrijf IS NOT NULL AND bez_afspraak_bedrijf <> 'Anoniem'; UPDATE prs_bedrijf SET prs_bedrijf_naam = ano.naam(prs_bedrijf_naam, 10) , prs_bedrijf_post_adres = ano.adres(prs_bedrijf_post_adres) , prs_bedrijf_post_postcode = ano.postcode(prs_bedrijf_post_postcode) , prs_bedrijf_bezoek_adres = ano.adres(prs_bedrijf_bezoek_adres) , prs_bedrijf_bezoek_postcode = ano.postcode(prs_bedrijf_bezoek_postcode) , prs_bedrijf_bezoek_plaats = ano.generic(prs_bedrijf_bezoek_plaats, 1) , prs_bedrijf_telefoon = ano.telefoon(prs_bedrijf_telefoon) , prs_bedrijf_telefoon2 = ano.telefoon(prs_bedrijf_telefoon2) , prs_bedrijf_fax = ano.telefoon(prs_bedrijf_fax) , prs_bedrijf_url = ano.generic(prs_bedrijf_url) , prs_bedrijf_email = ano.email(prs_bedrijf_email) , prs_bedrijf_contact_persoon = ano.naam(prs_bedrijf_contact_persoon) , prs_bedrijf_contact_telefoon = ano.telefoon(prs_bedrijf_contact_telefoon) , prs_bedrijf_contact_fax = ano.telefoon(prs_bedrijf_contact_fax); UPDATE prs_bedrijfadres SET prs_bedrijfadres_url = ano.email(prs_bedrijfadres_url) , prs_bedrijfadres_username = ano.naam(prs_bedrijfadres_username) , prs_bedrijfadres_password = NULL; UPDATE aut_idp SET aut_idp_secret = 'TEST_' || DBMS_RANDOM.string('a', 10) WHERE aut_idp_secret IS NOT NULL AND aut_idp_internal = 0; UPDATE aut_sp SET aut_sp_secret = 'TEST_' || DBMS_RANDOM.string('a', 10) WHERE aut_sp_secret IS NOT NULL AND aut_sp_internal = 0; UPDATE mld_adres SET mld_adres_bezoek_adres = ano.adres(mld_adres_bezoek_adres) , mld_adres_bezoek_postcode = ano.postcode(mld_adres_bezoek_postcode) , mld_adres_post_adres = ano.adres(mld_adres_post_adres) , mld_adres_post_postcode = ano.postcode(mld_adres_post_postcode) , mld_adres_contactpersoon = ano.naam(mld_adres_contactpersoon) , mld_adres_contactpers_telefoon = ano.telefoon(mld_adres_contactpers_telefoon) , mld_adres_contactpers_email = ano.email(mld_adres_contactpers_email) , mld_adres_telefoon = ano.telefoon(mld_adres_telefoon) , mld_adres_email = ano.email(mld_adres_email); UPDATE mld_melding SET mld_melding_naam_ext = ano.naam(mld_melding_naam_ext) , mld_melding_email_ext = ano.email(mld_melding_email_ext) , mld_melding_tel_ext = ano.telefoon(mld_melding_tel_ext); UPDATE mld_disc_params SET mld_disc_params_emailnw1 = ano.email(mld_disc_params_emailnw1) , mld_disc_params_emailnw2 = ano.email(mld_disc_params_emailnw2) , mld_disc_params_emailnw3 = ano.email(mld_disc_params_emailnw3) , mld_disc_params_emailnw4 = ano.email(mld_disc_params_emailnw4) , mld_disc_params_smsnw1 = ano.telefoon(mld_disc_params_smsnw1) , mld_disc_params_smsnw2 = ano.telefoon(mld_disc_params_smsnw2) , mld_disc_params_smsnw3 = ano.telefoon(mld_disc_params_smsnw3) , mld_disc_params_smsnw4 = ano.telefoon(mld_disc_params_smsnw4) WHERE mld_ins_discipline_key IN (SELECT ins_discipline_key FROM mld_discipline); ano.table_column('mld_opdr', 'mld_opdr_contactpersoon', 'naam'); ano.table_column('fin_verkoopfactuur', 'prs_debiteur_naam', 'naam'); ano.table_column('alg_gebouw', 'alg_gebouw_email', 'email'); ano.table_column('alg_locatie', 'alg_locatie_email', 'email'); ano.table_column('bez_bezoekers', 'bez_bezoekers_email', 'email'); ano.table_column('fac_notificatie', 'fac_notificatie_sender_email', 'email'); ano.table_column('fac_notificatie', 'fac_notificatie_receiver_email', 'email'); ano.table_column('ins_tab_discipline', 'ins_discipline_email', 'email'); ano.table_column('alg_locatie', 'alg_locatie_verantw_tel', 'telefoon'); ano.table_column('bez_afspraak', 'bez_afspraak_telefoonnr', 'telefoon'); ano.table_column('bez_bezoekers', 'bez_bezoekers_telefoon', 'telefoon'); ano.table_column('prs_contactpersoon', 'prs_contactpersoon_telefoon_1', 'telefoon'); ano.table_column('prs_contactpersoon', 'prs_contactpersoon_telefoon_2', 'telefoon'); ano.table_column('prs_perslid', 'prs_perslid_telefoonnr', 'telefoon'); ano.table_column('prs_perslid', 'prs_perslid_mobiel', 'telefoon'); END; PROCEDURE anonymize (p_startdatum IN DATE, p_einddatum IN DATE) AS BEGIN anonymizebes(p_startdatum, p_einddatum); anonymizebez(p_startdatum, p_einddatum); anonymizemld(p_startdatum, p_einddatum); anonymizeprs(p_startdatum, p_einddatum); END; PROCEDURE table_column(p_tabel IN VARCHAR2, p_kolom IN VARCHAR2, p_functie IN VARCHAR2) AS sql_str VARCHAR2(2000); BEGIN sql_str := 'UPDATE ' || p_tabel || ' SET ' || p_kolom || ' = ano.' || p_functie || '(' || p_kolom || ')' || ' WHERE ' || p_kolom || ' IS NOT NULL'; EXECUTE IMMEDIATE sql_str; END; FUNCTION postcode(postcode_veld IN VARCHAR2) RETURN VARCHAR2 IS c VARCHAR2(1); code VARCHAR2(15) := ''; BEGIN IF (postcode_veld IS NOT NULL) THEN FOR i IN 1..LENGTH(SUBSTR(postcode_veld,1,15)) LOOP c := SUBSTR(postcode_veld,i,1); BEGIN c := TO_CHAR(TO_NUMBER(c)); c := TO_CHAR(TRUNC(DBMS_RANDOM.value(0,10))); EXCEPTION WHEN VALUE_ERROR THEN IF (c NOT IN (' ','-')) THEN c := DBMS_RANDOM.string('u',1); END IF; END; code := code||c; END LOOP; END IF; RETURN code; END postcode; FUNCTION telefoon(telefoon_veld IN VARCHAR2) RETURN VARCHAR2 IS n NUMBER; r NUMBER; i NUMBER; f VARCHAR2(5) := '+-_ *'; -- alleen deze laten we staan tel VARCHAR2(30) := ''; c VARCHAR2(1); BEGIN IF (telefoon_veld IS NOT NULL) THEN n := DBMS_RANDOM.value(0,1); tel := TO_CHAR(TRUNC(n * POWER(10,LENGTH(telefoon_veld)))); FOR r IN 0..3 LOOP c := SUBSTR(f,r,1); i := 1; WHILE (INSTR(telefoon_veld, c, 1, i) > 0) LOOP tel := REGEXP_REPLACE(tel ,'(^.{'||(INSTR(telefoon_veld,c,1,i)-1)||'})(.{1})(.*)$' ,'\1'||c||'\3' ); i := i + 1; END LOOP; END LOOP; END IF; RETURN tel; END telefoon; FUNCTION adres(adres_veld IN VARCHAR2) RETURN VARCHAR2 IS c VARCHAR2(1); adres VARCHAR2(100) := ''; BEGIN IF (adres_veld IS NOT NULL) THEN FOR i IN 1..LENGTH(adres_veld) LOOP c := SUBSTR(adres_veld,i,1); BEGIN c := TO_CHAR(TO_NUMBER(c)); EXCEPTION WHEN VALUE_ERROR THEN IF (c <> ' ') THEN c := DBMS_RANDOM.string('l',1); END IF; END; adres := adres||c; END LOOP; END IF; RETURN INITCAP(adres); END adres; FUNCTION email(email_veld IN VARCHAR2) RETURN VARCHAR2 IS c varchar2(1); e varchar2(500) := '_'; a varchar2(500); email varchar2(500) := ''; occ number; BEGIN email := email_veld; IF (email IS NOT NULL) THEN occ := 0; WHILE (e IS NOT NULL) LOOP occ := occ + 1; SELECT REGEXP_SUBSTR(email, '([a-zA-Z0-9._+-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)', 1, occ) INTO e FROM dual; IF (e IS NOT NULL) THEN a := ''; FOR i IN 1..LENGTH(e) LOOP c := SUBSTR(e, i, 1); IF (c NOT IN ('.','@')) THEN c := DBMS_RANDOM.string('1',1); END IF; a := a || c; END LOOP; email := replace(email, e, a); END IF; END LOOP; END IF; RETURN email; END email; FUNCTION naam(naam_veld IN VARCHAR2, uniek IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS mx NUMBER := 60; -- Maximale lengte van naam_veld. ca NUMBER := 0; cx NUMBER := 0; ci NUMBER; nm VARCHAR2(200) := ''; BEGIN IF (naam_veld IS NOT NULL) THEN ca := LENGTH(naam_veld); ci := INSTR(naam_veld, '(', -1); IF (SUBSTR(naam_veld, ca, 1) = ')' AND ci > 0) THEN -- de naam bevat haakjes () cx := ca - ci + 1; -- - 1; ca := ca - cx; -- - 2; END IF; ca := LEAST(GREATEST(ca, uniek), mx); nm := UPPER(SUBSTR(naam_veld, 1, 1)) || DBMS_RANDOM.string('l', ca -1); IF (cx > 0) THEN cx := GREATEST(LEAST(cx, (mx - ca)), 0); nm := nm || '(' || DBMS_RANDOM.string('l', cx - 2) || ')'; END IF; END IF; RETURN nm; END naam; FUNCTION memo(memo_veld IN VARCHAR2) RETURN VARCHAR2 IS memo VARCHAR2(4000) := ''; c VARCHAR2(1) := ''; r VARCHAR2(1); BEGIN IF (memo_veld IS NOT NULL) THEN FOR i IN 1..LENGTH(memo_veld) LOOP r := SUBSTR(memo_veld,i,1); IF (r NOT IN (' ','.') ) THEN c := DBMS_RANDOM.string('l',1); IF (r = UPPER(r)) THEN c := UPPER(c); END IF; ELSE c := r; END IF; memo := memo||c; END LOOP; END IF; RETURN memo; END memo; FUNCTION generic(veld IN VARCHAR2, fmt IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS BEGIN -- fmt is wat formatting -- 0 = niks -- 1 = INITCAP IF (veld IS NOT NULL) THEN IF fmt = 1 THEN RETURN INITCAP(DBMS_RANDOM.string('l', LENGTH(veld))); ELSE RETURN DBMS_RANDOM.string('l', LENGTH(veld)); END IF; ELSE RETURN NULL; END IF; END generic; END ano; / REGISTERRUN('$Id$') #endif // ANO