Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo mặt nạ dữ liệu Oracle

Sự cố này được giải quyết dễ dàng trong 12c với hàm STANDARD_HASH .

Giải pháp trong các phiên bản trước chỉ phức tạp hơn một chút. Tạo một trình bao bọc đơn giản xung quanh DBMS_CRYPTO hoạt động giống như STANDARD_HASH:

--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;
/

Bạn có thể cần đăng nhập bằng SYS và cấp cho người dùng của mình quyền truy cập vào DBMS_CRYPTO để làm cho chức năng hoạt động:

grant execute on sys.dbms_crypto to <your_schema>;

Tạo một từ đồng nghĩa công khai, cấp nó cho mọi người và nó hoạt động theo cùng một cách.

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

Đây là một ví dụ đơn giản về việc sử dụng hàm:

update some_table
set column1 = standard_hash(column1),
    column2 = standard_hash(column2);

Tuy nhiên, việc cập nhật một lượng lớn dữ liệu có thể bị chậm. Có thể nhanh hơn để tạo bảng mới, bỏ bảng cũ, đổi tên bảng mới, v.v. Và giá trị băm có thể lớn hơn kích thước cột, có thể cần phải alter table some_table modify column1 varchar2(40 byte);

Tôi ngạc nhiên là có bao nhiêu sản phẩm và công cụ để làm một việc đơn giản như vậy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. N giá trị khác biệt hàng đầu của một cột trong Oracle

  2. Loại tùy chỉnh Hibernate để tránh 'Gây ra bởi:java.sql.SQLException:Luồng đã bị đóng'

  3. Hibernate Oracle Tablespace Annotation

  4. Đặt lại trình tự trong oracle 11g

  5. KIỂM TRA CONSTRAINT của chuỗi chỉ chứa các chữ số. (Oracle SQL)