oracle儲存過程中authid current_user和authid definer
以下舉例說明,authid current_user和authid 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是使用定義者的許可權去執行的,system有select 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_objects的select許可權,而且這個許可權不是來自於角色。
總結:
1.authid current_user使用的是呼叫者的許可權去執行,authid definer使用定義者的許可權去執行。
2.角色在authid definer的儲存過程中是disabled。
3.儲存過程編譯時角色也是disabled,並且不驗證動態SQL的許可權。
4.以上也適用於函式、觸發器,即命名的PL/SQL塊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2139653/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE 儲存過程中的Authid Current_UserOracle儲存過程
- 儲存過程許可權__Authid Current_User儲存過程
- AUTHID DEFINER\authid current_user與alter session set current_schemaSession
- job中呼叫儲存過程,儲存過程使用AUTHID CURRENT_USER,還出現ORA-01031儲存過程
- Oracle:Authid Current_User的使用(轉)Oracle
- 使用 Authid Current_User 為呼叫者授權
- mysql儲存過程的許可權 definerMySql儲存過程
- Oracle 定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)Oracle
- 儲存過程中user_tables的owner是definer還是invoker儲存過程
- java中呼叫ORACLE儲存過程JavaOracle儲存過程
- Oracle儲存過程Oracle儲存過程
- 在Oracle中查詢儲存過程和函式Oracle儲存過程函式
- oracle 儲存過程中螢幕列印Oracle儲存過程
- oracle儲存過程中的陣列Oracle儲存過程陣列
- Jsp中呼叫Oracle儲存過程JSOracle儲存過程
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程例子Oracle儲存過程
- Oracle建立儲存過程Oracle儲存過程
- oracle plsql儲存過程OracleSQL儲存過程
- ORACLE 儲存過程示例Oracle儲存過程
- Oracle中執行儲存過程call和exec區別Oracle儲存過程
- Oracle 儲存過程中的DDL語句Oracle儲存過程
- [PL/SQL]Something about authid for proceduresSQL
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- MySQL和Oracle對比之儲存過程MySqlOracle儲存過程
- 在儲存過程A中呼叫儲存過程B的結果儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- oracle 儲存過程批次提交Oracle儲存過程
- oracle 儲存過程學習Oracle儲存過程
- [Flashback]Oracle flashback儲存過程Oracle儲存過程
- Oracle儲存過程學習Oracle儲存過程
- oracle的儲存過程格式Oracle儲存過程
- java 呼叫oracle 儲存過程JavaOracle儲存過程
- oracle--08儲存過程Oracle儲存過程