Oracle 定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)

lhrbest發表於2017-06-15

Oracle定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)





參考:




正如大家所知,Oracle從8i開始引入了呼叫者許可權體系結構,之前一直使用定義者許可權體系結構。

一、簡單介紹一下二者的使用方法

oracle建立儲存過程時,若不指定authid引數,則呼叫許可權驗證預設是definer,也就是儲存過程執行時,以這個儲存過程的建立者的身份來驗 證存取許可權;可以在建立儲存過程時指定authid為current_user,從而在執行儲存過程時根據當前呼叫儲存過程的使用者許可權來驗證。
舉個例子說明:
比如有兩個使用者test和user1,test使用者下有個表user1table,使用者user1只有這個表的select許可權。test建立了一個儲存 過程testproc,使用預設的authid呼叫方式,儲存過程內容為“insert into user1table ....”,然後使用grant execute on testproc to user1將執行許可權賦予user1,那麼user1就可以呼叫這個儲存過程向user1table新增資料。注意:此時user1並沒有對錶 user1table的insert許可權,但由於testproc執行的時候,是根據test使用者的許可權來驗證的,因此insert語句不會出現許可權不足 的提示。

假如建立testproc是新增了authid current_user,則當user1呼叫test.testproc儲存過程時,就會報兩個錯誤:一是user1table未定義,二是對 user1table沒有insert許可權。對於第一個問題,原因是user1table僅在test使用者模式下,user1使用者不能直接引用,可以在定 義testproc時使用test.user1table方式;對於第二個問題,由於user1沒有對user1table的insert許可權,因此無法 執行這個儲存過程,除非給user1使用者增加user1table表的insert許可權。

二、定義者許可權與呼叫者許可權之間差異

關於定義者許可權與呼叫者許可權之間的相通點或者是各自優勢本文不做探討,這裡僅描述呼叫者許可權與定義者許可權之間的差異,在我看來,主要有三個方面:

1、執行的schema不同,操作的物件也不同

在定義者(definer)許可權下,執行的使用者操作的schema為定義者,所操作的物件是定義者在編譯時指定的物件。

在呼叫者(invoker)許可權下,執行的使用者操作的schema為當前使用者,所操作的物件是當前模式下的物件。

例如:

E:\ora10g>sqlplus "/ as sysdba"

連線到:

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL>create user tmpa identified by tmpa;

使用者已建立。

SQL>grant connect,resource to tmpa;

授權成功。

SQL>create user tmpb identified by tmpb;

使用者已建立。

SQL>grant connect,resource to tmpb;

授權成功。

SQL>conn tmpa/tmpa

已連線。

SQL>set sqlprompt TMPA>

TMPA>create table tmptbl(str varchar2(50));

表已建立。

TMPA>insert into tmptbl values ('I''m ownered by user:tmpa');

已建立 1 行。

TMPA>commit;

提交完成。

TMPA>create or replace procedure definer_proc as

  2  begin

  3    for x in (select sys_context('userenv', 'current_user') current_user,

  4                     sys_context('userenv', 'session_user') session_user,

  5                     sys_context('userenv', 'current_schema') current_schema,

  6                     str

  7                from tmptbl) loop

  8      dbms_output.put_line('Current User:   ' || x.current_user);

  9      dbms_output.put_line('Session User:   ' || x.session_user);

 10      dbms_output.put_line('Current Schema: ' || x.current_schema);

 11      dbms_output.put_line('Tables Value:    ' || x.str);

 12    end loop;

 13  end;

 14  /

過程已建立。

TMPA>create or replace procedure invoker_proc AUTHID CURRENT_USER as

  2  begin

  3    for x in (select sys_context('userenv', 'current_user') current_user,

  4                     sys_context('userenv', 'session_user') session_user,

  5                     sys_context('userenv', 'current_schema') current_schema,

  6                     str

  7                from tmptbl) loop

  8      dbms_output.put_line('Current User:   ' || x.current_user);

  9      dbms_output.put_line('Session User:   ' || x.session_user);

 10      dbms_output.put_line('Current Schema: ' || x.current_schema);

 11      dbms_output.put_line('Tables Value:    ' || x.str);

 12    end loop;

 13  end;

 14  /

過程已建立。

TMPA>set serveroutput on

TMPA>grant execute on definer_proc to tmpb;

授權成功。

TMPA>grant execute on invoker_proc to tmpb;

授權成功。

TMPA>exec definer_proc;

Current User:   TMPA

Session User:   TMPA

Current Schema: TMPA

Tables Value:    I'm ownered by user:tmpa

PL/SQL 過程已成功完成。

TMPA>exec invoker_proc;

Current User:   TMPA

Session User:   TMPA

Current Schema: TMPA

Tables Value:    I'm ownered by user:tmpa

PL/SQL 過程已成功完成。

可以看到,對於owner所擁有的物件,當前使用者和session使用者都是當前執行過程的使用者;

新開一個連線,以tmpb使用者登陸再執行看看:

E:\ora10g>sqlplus tmpb/tmpb

連線到:

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> set sqlprompt TMPB>

TMPB>create table tmptbl(str varchar2(50));

表已建立。

TMPB>insert into tmptbl values ('I''m ownered by user:tmpb');

已建立 1 行。

TMPB>commit;

提交完成。

TMPB>set serveroutput on

TMPB>exec tmpa.definer_proc;

Current User:   TMPA

Session User:   TMPB

Current Schema: TMPA

Tables Value:    I'm ownered by user:tmpa

PL/SQL 過程已成功完成。

TMPB>exec tmpa.invoker_proc;

Current User:   TMPB

Session User:   TMPB

Current Schema: TMPB

Tables Value:    I'm ownered by user:tmpb

PL/SQL 過程已成功完成。

呼叫非owner的過程,對於定義者許可權的過程,雖然session是tmpb,但當前使用者仍然是tmpa,訪問的物件也是tmpa的表,而對於呼叫者許可權的過程,當前session和使用者都是當前執行過程的使用者tmpb,而且訪問的物件也是當前使用者的物件。

2、執行的許可權不同

在定義者(definer)許可權下,當前使用者的許可權為角色無效情況下所擁有的許可權。

在呼叫者(invoker)許可權下,當前使用者的許可權為當前所擁有的許可權(含角色)。

例如:

仍用前文中的使用者

TMPA>create or replace procedure createtbl_definer as

  2  begin

  3    execute immediate 'create table tmptbl2 (id number)';

  4  end;

  5  /

過程已建立。

TMPA>create or replace procedure createtbl_invoker AUTHID CURRENT_USER as

  2  begin

  3    execute immediate 'create table tmptbl2 (id number)';

  4  end;

  5  /

過程已建立。

首先執行定義者許可權過程:

TMPA>exec createtbl_definer;

BEGIN createtbl_definer; END;

*

第 1 行出現錯誤:

ORA-01031: 許可權不足

ORA-06512: 在 "TMPA.CREATETBL_DEFINER", line 3

ORA-06512: 在 line 1

由於角色無效,相當於當前使用者沒有了建表許可權,因此建立失敗,這也正是為什麼過程中執行DDL語句需要顯示授權的原因。

TMPA>exec createtbl_invoker;

PL/SQL 過程已成功完成。

TMPA>desc tmptbl2

 名稱                                      是否為空? 型別

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

執行呼叫者許可權過程,能夠成功建立!

3、執行的效率不同

在定義者(definer)許可權下,過程被靜態編譯靜態執行(相對而言),所執行sql語句在共享區池中是可被共享使用的

在呼叫者(invoker)許可權下,過程靜態編譯,但動態執行,雖然執行的語句相同,但不同使用者執行,其sql語句在共享池中並不能共享。

歸根結底,正如tom所說,呼叫者許可權體系結構的確擁有非常強大的功能,但只有當你使用得當時才能感受到其優勢。







About Me

...............................................................................................................................

● 本文整理自網路

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-06-02 09:00 ~ 2017-06-30 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

Oracle 定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)
DBA筆試面試講解
歡迎與我聯絡

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

相關文章