在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...