Apex-Oracle: Phân quyền select cho table system

Ứng dụng phê duyệt theo quy trình của mình trên APEX cần thêm tính năng gửi email thông báo tới người nhận thông tin tiếp theo cũng như thông tin phê duyệt hoặc từ chối tới email của người dùng. Mình chỉ việc viết thêm hàm gửi email vào trong mỗi bước phê duyệt hoặc từ chối là xong. Code gửi email được viết bằng PL/SQL trên server Oracle mới đã có sẵn package đã được sử dụng từ trước rồi nhưng khi tiến hành dịch lại trên server này thì lại gặp lỗi thông báo bảng dba_directories không tồn tại. Lỗi này là do table không được phân quyền select trên Oracle.

Thực chất bảng dba_directories này là bảng của hệ thống nhưng với schema đang đăng nhập thì lại không có quyền gì thao tác trên bảng này. Đối với hàm gửi email cần truy cập bảng dba_directories để lấy đường dẫn nên ta phải tiến hành phân quyền select vào bảng dba_directories cho user (hay còn gọi là schema) chạy hàm gửi email này. Bởi vì bảng dba_directories là bảng của hệ thống nên ta phải sử dụng quyền sysdba để tiến hành phân quyền.

Sau đây là các bước phân quyền select cho table

Đối với server database Oracle chạy hệ điều hành Windown thì ta tiến hành các bước sau để phân quyền:

  • Bước 1: Login bằng tài khoản admin vào server database Oracle.
  • Bước 2: Mở cửa sổ command line cmd.exe lên
  • Bước 3: Bật sqlplus với quyền sysdba
    sqlplus “/ as sysdba”
  • Bước 4: Phân quyền select table cho user cần quyền select
    grant select on dba_directories to PKTUY_user;
  • Bước 5: Kết quả sau khi grant được thông báo là:
    Grant succeeded.

Sau khi đã phân quyền xong thì biên dịch lại package không còn bị lỗi nêu trên nữa.

Một số bài viết liên quan đến quản trị hệ thống Oracle:

Oracle Cách print in dữ liệu ra console để fix bug

Trong lĩnh vực SQL Developer trên Oracle, ta thường xuyên phải lập trình với function hoặc procedure hoặc đơn giản chạy một script lệnh nào đó. Thỉnh thoảng ta sẽ gặp các bug mà không biết lỗi xử lý ở bước nào. Các nhanh nhất để tìm và fix các bug này là việc ghi log ra console hoặc ghi log vào một bảng nào đó để xem. Mình thì cách đơn giản nhất đó là ghi log ra console.

Rất may trên công cụ Toad for Oracle thì có tính năng DBMS Ouput để ta có thể đọc log mà mình viết bằng câu lệnh DBMS_OUTPUT.PUT_LINE(‘text’). Mặc định trên Toad thì tính năng này bị Disable để tối ưu công cụ. Để bật nó lên ta vào thanh menu ở phía dưới màn hình soạn thảo code, chọn đến tab DBMS Ouput và click vào nút màu đỏ phía dưới. Khi tính năng DBMS Ouput được bật ta sẽ thấy cái nút màu đỏ vừa rồi chuyển sang màu xanh lá cây. Tại đây ta có thể chọn thời gian Toad làm mới để lấy log ra, mặc định là 5s một lần.

Dưới đây là câu lệnh ghi log trong SQL:

var_log VARCHAR(100):= 'log'
DBMS_OUTPUT.PUT_LINE('I got here:'||var_log||' is the new value');

Tạo hàm mã hóa SHA-256 trên Oracle 11g R2 (hashing-with-sha-256-in-oracle-11g-r2)

Hàm băm SHA1 đã được công bố đã bị phá mà không phải bằng thuật toán vét cạn.
Tất cả các mã hóa toàn vẹn dữ liệu của mã SHA-1 cần phải chuyển đổi sang bộ mã hóa cao cấp hơn ví dụ hàm SHA-256.

Trong hệ thống của công ty mình hiện đang sử dụng SHA-1 để mã hóa thông tin trước khi gửi sang đối tác, vì vậy cần phải nâng cấp sang hàm băm SHA-256.
Hàm băm SHA-256 chỉ có sẵn từ bản Oracle 12c, bản Oracle 11g sẽ không có. Có 2 cách để có được hàm băm SHA-256:
Cách 1: Sử dụng thư viện của Java có sẵn trong JDK để tạo nên hàm SHA-256
Tham khảo tại địa chỉ: https://dzone.com/articles/hashing-with-sha-256-in-oracle-11g-r2
Nhưng ở địa chỉ này chạy sẽ không được procedure do phải tắt tính năng define của Orcle đi.
Các bước lần lượt như sau:

B1: Tắt chế độ define

set define off


B2: Tạo tài nguyên class Java trong Oracle:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED test."calcsha"
    AS import java.security.MessageDigest; 
 public class calcsha2 
     {
         static public String fncsha(String inputVal) throws Exception
         {           
             MessageDigest myDigest = MessageDigest.getInstance("SHA-256");        
             myDigest.update(inputVal.getBytes());
             byte[] dataBytes = myDigest.digest();
             StringBuffer sb = new StringBuffer();
             for (int i = 0; i < dataBytes.length; i++) {
              sb.append(Integer.toString((dataBytes[i])).substring(1));
             }        
             StringBuffer hexString = new StringBuffer();
             for (int i=0;i<dataBytes.length;i++) {
                 String hex=Integer.toHexString(0xff & dataBytes[i]);
                     if(hex.length()==1) hexString.append('0');
                     hexString.append(hex);
             }
             String retParam = hexString.toString();
             return retParam;           
         }    
     }

B3: Viết thủ tục để gọi đến tài nguyên trên:

CREATE OR REPLACE FUNCTION test.hash_sha256 (txt varchar2)
 RETURN VARCHAR2
 AS
 LANGUAGE JAVA
 NAME 'calcsha2.fncsha(java.lang.String) return String';

B4: Bật trả chế độ define

 set define on

B5: Test kết quả:

 select hash_sha256('123456789') from dual;



So sánh với kết quả online: https://passwordsgenerator.net/sha256-hash-generator/

Cách 2: Cách này viết mới luôn hàm SHA-256 bằng PL-SQL
Tham khảo tại: https://github.com/CruiserX/sha256_plsql

Ta cũng có thể test kết quả so với cách 1.

Trưởng nhóm mình yêu cầu làm cách 2. Theo bản thân mình thì nên làm cách 1 vì toàn bộ là sử dụng thư viện chung JAVA của toàn thế giới, phần code tường minh. Còn cách 2 thì đi copy trên mạng về chạy cảm giác không được an toàn lắm.

APEX 5.x Thiết lập mặc định báo cáo trong Interactive Report

Trong quá trình duy trì và phát triển thêm các tính năng báo cáo của công ty sử dụng công cụ Apex, mình cần phải chỉnh sửa một báo cáo sử dụng loại có tên là Interactive Reoport.
Người dùng muốn bổ sung thêm cột dữ liệu mới ẩn bớt cột đi theo nghiệp vụ. Trong phần Page Designer mình đã thêm cột thành công nhưng gặp 2 vấn đề:

  • Không thể nào đặt các cột mới theo đúng vị trí mà mình muốn, mặc dù trong phần Columns đã kéo thả để sắp xếp
  • Không biết cách làm sao để query báo cáo vẫn có nhưng mặc định báo cáo hiển thị không có, khi nào người dùng cần thì dùng tính năng Actions -> Select column để có thể hiển thị.

Để hiển thị mặc định đối với tất cả các người dùng theo một form nhất định như thứ tự các cột cần hiển thị, danh sách các cột ẩn, danh sách các cột hiển thị thì ta dùng cách sau:

B1: Đăng nhập bằng tài khoản admin
B2: Vào giao diện ứng dụng của người dùng đầu cuối. Trong thanh menu tìm kiếm tùy chỉnh của báo cáo. Click Actions và thực hiện các thay đổi theo báo cáo mình cần hiển thị:

  • Select columns: Sắp xếp, lựa chọn các cột cần hiển thị.
  • Filter: Đặt các điều kiện để lọc dữ liệu
  • Rows per page: Cấu hình số dòng trên 1 trang…

B3: Lưu lại cấu hình mặc định này bằng cách vào Actions -> Save Report.
Mục Save chọn: As Default Report Setting sau đó chọn Apply.

Done. Tất cả các User khi truy cập báo cáo này sẽ được mặc định hiển thị dữ liệu theo cách mà ta đã cài đặt.