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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AUTHID CURRENT_USER的注意點
- Oracle儲存過程Oracle儲存過程
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- Sqlserver中的儲存過程SQLServer儲存過程
- jsp中呼叫儲存過程JS儲存過程
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- 使用JavaScript和Python實現Oracle資料庫的儲存過程?JavaScriptPythonOracle資料庫儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- MySQL儲存過程的建立和使用MySql儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- MySQL儲存過程中如何使用ROLLBACKMySql儲存過程
- Oracle儲存過程乾貨(二):PLSQL控制語句Oracle儲存過程SQL
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程