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 và 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