創建存儲過程一定要加上Authid Current_User is,不然非dba權限其他用戶無法調用該過程
一、存儲過程中創建表沒有權限
create or replace procedure p_create_table Authid Current_User is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table;
查閱資料發現:
Oracle8i以前的版本,所有已編譯存儲對象,包括packages, procedures, functions, triggers, views等,只能以定義者(Definer)身份解析運行;
而Oracle8i及其後的新版本,Oracle引入調用者(invoker)權限,使得對象可以以調用者身份和權限執行。
遇到這種情況,通常解決方法是進行顯式的系統權限: grant create table to eric;
但是,此方法太笨,因爲有可能執行一個存儲過程,需要很多不同權限(oracle對權限劃分粒度越來越細)。
最好的方法是,利用 oracle 提供的方法,在創建存儲過程時,加入 Authid Current_User 條件進行權限分配。
create or replace procedure p_CreateTable Authid Current_User
as
begin
execute immediate ''create table test_tb(id number)'';
end p_CreateTable;
/
Procedure created.
二、創建和管理JOB沒有權限
oracle中創建job是通過調用dbms_scheduler.create_job來做. 用戶需要能創建job,管理job
對應的權限:
1) create job
2) manager scheduler
相應命令如下:
grant create job to orace_user1;
grant manage scheduler to orace_user1;