oracle物件的定義 執行許可權

2021-09-30 13:04:30 字數 3764 閱讀 5965

在oracle8i以前,所有已編譯儲存物件(包括packages,procedures, functions, triggers, andviews)只能以定義者(definer)身份解析執行;從oracle8i開始,oracle引入呼叫者(invoker)許可權,使得物件可以以呼叫者身份和許可權執行。

1、使用定義者身份執行——

authid definer

(預設方式,不指定時就是這種方式):

可以通過在命名程式部分中使用authid definer 關鍵字來實現

。任何使用者接收到執行以這種方式編譯的程式的許可權後,將會以程式所有者的身份執行該程式。 

create or replacefunction hr.quarterly_sales 

authid definer 

as 

begin 

end;  2、

使用呼叫者的許可權來執行程式

——authid current_user:

create as replacefunction hr.quarterly_sales 

authidcurrent_user 

as 

begin 

end;

【例項】

1.以eygle使用者(definer)建立2個過程

$ sqlplus eygle/eygle

sql*plus:release 9.2.0.4.0 - production on sun dec 11 11:39:27 2005

connectedto:

oracle9ienterprise edition release 9.2.0.4.0 - 64bit production

withthe partitioning option

jserverrelease 9.2.0.4.0 - production

sql>create or replace procedure definer_proc

2  as

3  begin

4      for x in

5      ( select sys_context('userenv', 'current_user' ) current_user,

6              sys_context( 'userenv', 'session_user' ) session_user,

7              sys_context( 'userenv', 'current_schema' ) current_schema

8          fromdual )

9      loop

10         dbms_output.put_line( 'current user:   ' || x.current_user );

11         dbms_output.put_line( 'session user:   ' || x.session_user );

12         dbms_output.put_line( 'current schema: ' || x.current_schema );

13      end loop;

14  end;

15  /

procedurecreated.

sql>

sql>grant execute on definer_proc to test;

grantsucceeded.

sql>

sql>create or replace procedure invoker_proc

2  authid current_user

3  as

4  begin

5      for x in

6      ( select sys_context('userenv', 'current_user' ) current_user,

7              sys_context( 'userenv', 'session_user' ) session_user,

8              sys_context( 'userenv', 'current_schema' ) current_schema

9          fromdual )

10      loop

11         dbms_output.put_line( 'current user:   ' || x.current_user );

12         dbms_output.put_line( 'session user:   ' || x.session_user );

13         dbms_output.put_line( 'current schema: ' || x.current_schema );

14      end loop;

15  end;

16  /

procedurecreated.

sql>

sql>grant execute on invoker_proc to test;

grantsucceeded.

注意invoker許可權的本質是引入了authidcurrent_user子句,通過此句oracle得以使用invoker身份編譯執行物件。

2.以test使用者(invoker)身份執行

sql>connect test/test

connected.

sql>

sql>set serveroutput on

sql>exec eygle.definer_proc

current user:

eygle

session user:

test

current schema: eygle

pl/sqlprocedure successfully completed.

sql>exec eygle.invoker_proc

current user:

test

session user:

test

current schema: test

pl/sqlprocedure successfully completed.

注意只有使用invoker者許可權執行時,schema才轉換為test.

sql>alter session set current_schema = system;

sessionaltered.

sql>exec eygle.definer_proc

current user:

eygle

session user:

test

currentschema: eygle

pl/sqlprocedure successfully completed.

sql>exec eygle.invoker_proc

current user:

test

session user:

test

current schema: system

pl/sqlprocedure successfully completed.

sql>

通過alter session setcurrent_schema

方式修改當前模式之後,我們看到仍然是僅當使用

invoker

許可權執行時,

schmea

方切換為

system. 

源文件<

>

oracle 物件許可權

sys使用者查詢ww使用者建立的表 已經commited select from ww.wwtable 普通使用者lisi查詢ww使用者的表 grant select on wwtable to lisi select from ww.wwtable 物件授權操作 grant insert on w...

Oracle儲存過程執行許可權

預設情況下,在呼叫儲存過程使用者的角色是不起作用的,即在執行儲存過程時只有public許可權。所以如果被呼叫的儲存過程中如果有execute immediate create table.語句,將會引發ora 01031 insufficient privileges錯誤。儲存過程分為兩種,即dr ...

oracle的系統和物件許可權

alter any cluster 修改任意簇的許可權 alter any index 修改任意索引的許可權 alter any role 修改任意角色的許可權 alter any sequence 修改任意序列的許可權 alter any snapshot 修改任意快照的許可權 alter any...