oracle儲存過程中authid current_user和authid definer

selectshen發表於2017-05-21

以下舉例說明,authid current_userauthid definer的一些差別。

DB Version :11.2.0.4

舉例1

使用者system:

使用者system新建一個儲存過程p_test,這裡authid current_user

create or replace procedure p_test

authid current_user

 as

  v_count number;

begin

  select count(*) into v_count from dba_objects;

  dbms_output.put_line(v_count);

end;

使用者system授權scott有執行這個儲存過程system.p_test的許可權。

grant execute on system.p_test to scott;

使用者scott:

使用者scott執行儲存過程system.p_test

begin

  system.p_test;

end;

報錯,表或檢視不存在,因為沒許可權select檢視dba_objects

ORA-00942: table or view does not exist

ORA-06512: at "SYSTEM.P_TEST", line 6

ORA-06512: at line 2

使用者system:

使用者system新建一個儲存過程p_test,這裡不指定authid,即預設的authid definer

create or replace procedure p_test

 as

  v_count number;

begin

  select count(*) into v_count from dba_objects;

  dbms_output.put_line(v_count);

end;

使用者scott:

使用者scott執行儲存過程system.p_test

begin

  system.p_test;

end;

執行成功。authid definer是使用定義者的許可權去執行的,systemselect dba_objects的許可權,所執行成功。

 

舉例2

使用者system:

使用者system新建一個儲存過程p_test2,這裡不指定authid,即預設的authid definer

create or replace procedure p_test2

 as

  begin

  execute immediate 'create table scott.tb_01 as select * from dual';

end;

使用者system執行儲存過程system.p_test

begin

  system.p_test2;

end;

報錯,無許可權。雖然system有執行create table scott.tb_01的許可權,但這個許可權是角色DBA中的許可權,在authid definer的儲存過程是disabled[All roles are disabled in any named PL/SQL block (stored procedure, function, or trigger) that executes with definer's rights.]

ORA-01031: insufficient privileges

ORA-06512: at "SYSTEM.P_TEST2", line 5

ORA-06512: at line 2

使用者system新建一個儲存過程p_test2,這裡authid current_user

create or replace procedure p_test2

authid current_user

 as

  begin

  execute immediate 'create table scott.tb_01 as select * from dual';

end;

使用者system執行儲存過程system.p_test

begin

  system.p_test2;

end;

執行成功。authid current_user時,使用儲存過程的會話的角色DBA中的許可權是enabled,所以執行成功。這一點可以透過在儲存過程中檢視session_roles檢視來驗證。

執行成功。

 

舉例3

使用者system:

使用者system授權DBA角色給scott。這裡注意,scoot只有授權之後的新會話才具有DBA角色。

grant dba to scott;

使用者scott:

使用者scott新建一個儲存過程p_test

create or replace procedure p_test

 as

  v_count number;

begin

  select count(*) into v_count from dba_objects;

  dbms_output.put_line(v_count);

end;

編譯時報錯,表或檢視不存在。因為scott雖然具有DBA的角色,但在編譯時,角色是disabled。這裡不論authid current_user還是authid definer,因為authid屬性是作用於執行時,而不是編譯時。

Compilation errors for PROCEDURE SCOTT.P_TEST

Error: PL/SQL: ORA-00942: table or view does not exist

Line: 6

Text: select count(*) into v_count from dba_objects;

使用者system:

--使用者system授權dba_objects檢視的select許可權給scott

grant select on dba_objects to scott;

使用者scott:

使用者scott新建一個儲存過程p_test

create or replace procedure p_test

 as

  v_count number;

begin

  select count(*) into v_count from dba_objects;

  dbms_output.put_line(v_count);

end;

編譯成功。因為這時scott具有對檢視dba_objectsselect許可權,而且這個許可權不是來自於角色。

 

總結:

1.authid current_user使用的是呼叫者的許可權去執行,authid definer使用定義者的許可權去執行。

2.角色在authid definer的儲存過程中是disabled

3.儲存過程編譯時角色也是disabled,並且不驗證動態SQL的許可權。

4.以上也適用於函式、觸發器,即命名的PL/SQL塊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2139653/,如需轉載,請註明出處,否則將追究法律責任。

相關文章