All about Oracle Technologies

Friday, 2 January 2015

Lỗi "ORA-01031: insufficient privileges”

10:19 Posted by NTP No comments

Lỗi “ORA-01031: insufficient privileges” khi thực thi câu lệnh “execute immediate DDL_Statement”.

Xét ví dụ sau khi thực hiện trên cùng 1 schema:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CREATE OR REPLACE PROCEDURE pr_test
IS
BEGIN
    EXECUTE IMMEDIATE 'create table test(test_date date)';
END;


BEGIN
    pr_test;
END;
Ta thấy rằng việc tạo 1 thủ tục và gọi thủ tục (có sử dụng hàm DDL động) thực thi trên cùng 1 schema thì bị Oracle báo lỗi ORA-01031: insufficient privileges. Tại sao lại như vậy?

Mặc định khi thực thi thủ tục, hàm hay object tương đương thì Oracle thực thi bằng quyền của người tạo ra đối tượng đó chứ không dùng quyền của người đang thực thi. Do vậy với ví dụ trên ta thấy rằng cùng là 1 schema tạo ra nhưng khi thực thi 1 câu lệnh DDL động (bằng câu lệnh EXECUTE IMMEDIATE) thì Oracle lại báo thiếu quyền. Oracle không cho thực hiện câu lệnh DDL động này cũng nhằm mục đích tránh cho hệ thống bị SQL Injection (tham khảo thêm về Oracle SQL Injection ở đây http://www.oratechinfo.co.uk/sql_injection.htm).
Vậy làm sao để thực thi được câu lệnh DDL động trong ví dụ trên?

Trả lời : Oracle hỗ trợ cho chúng ta 2 mệnh đề AUTHID CURRENT_USER AUTHID DEFINER để làm việc đó. Vậy bằng cách thêm 1 trong 2 mệnh đề trên vào trong lúc tạo thủ tục, hàm hay package ta sẽ không bị lỗi như trên nữa.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CREATE OR REPLACE PROCEDURE pr_test authid current_user
IS
BEGIN
    EXECUTE IMMEDIATE 'create table test(test_date date)';
END;


BEGIN
    pr_test;
END;

Hoặc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CREATE OR REPLACE PROCEDURE pr_test authid definer
IS
BEGIN
    EXECUTE IMMEDIATE 'create table test(test_date date)';
END;


BEGIN
    pr_test;
END;

0 comments :

Post a Comment