Dit probleem is eenvoudig op te lossen in 12c met de functie STANDARD_HASH .
De oplossing in eerdere versies is alleen iets gecompliceerder. Bouw een eenvoudige wrapper rond DBMS_CRYPTO die net als STANDARD_HASH werkt:
--Imitation of the 12c function with the same name.
--Remember to drop this function when you upgrade!
create or replace function standard_hash(
p_string varchar2,
p_method varchar2 default 'SHA1'
) return varchar2 is
v_method number;
v_invalid_identifier exception;
pragma exception_init(v_invalid_identifier, -904);
begin
--Intentionally case-sensitive, just like the 12c version.
if p_method = 'SHA1' then
v_method := dbms_crypto.hash_sh1;
--These algorithms are only available in 12c and above.
$IF NOT DBMS_DB_VERSION.VER_LE_11 $THEN
elsif p_method = 'SHA256' then
v_method := dbms_crypto.hash_sh256;
elsif p_method = 'SHA384' then
v_method := dbms_crypto.hash_sh384;
elsif p_method = 'SHA512' then
v_method := dbms_crypto.hash_sh512;
$END
elsif p_method = 'MD5' then
v_method := dbms_crypto.hash_md5;
else
raise v_invalid_identifier;
end if;
return rawToHex(dbms_crypto.hash(utl_raw.cast_to_raw(p_string), v_method));
end;
/
Mogelijk moet u zich aanmelden met SYS en uw gebruiker toegang verlenen tot DBMS_CRYPTO om de functie te laten werken:
grant execute on sys.dbms_crypto to <your_schema>;
Maak een openbaar synoniem, geef het aan iedereen en het werkt op precies dezelfde manier.
create public synonym standard_hash for <schema with function>.standard_hash;
grant execute on standard_hash to public;
select standard_hash('Some text', 'MD5') from dual;
9DB5682A4D778CA2CB79580BDB67083F
select standard_hash('Some text', 'md5') from dual;
ORA-00904: : invalid identifier
Hier is een eenvoudig voorbeeld van het gebruik van de functie:
update some_table
set column1 = standard_hash(column1),
column2 = standard_hash(column2);
Maar het bijwerken van grote hoeveelheden gegevens kan traag zijn. Het kan sneller zijn om een nieuwe tabel te maken, de oude weg te laten, de nieuwe te hernoemen, enz. En de hash-waarde kan groter zijn dan de kolomgrootte, het kan nodig zijn om alter table some_table modify column1 varchar2(40 byte);
Het verbaast me hoeveel producten en tools er zijn om zoiets eenvoudigs te doen.