Oracle 定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)
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不同,操作的物件也不同
l 在定義者(definer)許可權下,執行的使用者操作的schema為定義者,所操作的物件是定義者在編譯時指定的物件。
l 在呼叫者(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、執行的許可權不同
l 在定義者(definer)許可權下,當前使用者的許可權為角色無效情況下所擁有的許可權。
l 在呼叫者(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、執行的效率不同
l 在定義者(definer)許可權下,過程被靜態編譯靜態執行(相對而言),所執行sql語句在共享區池中是可被共享使用的
l 在呼叫者(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群,學習最實用的資料庫技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2140774/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 呼叫者許可權與定義者許可權的pl/sql子程式SQL
- Django(63)drf許可權原始碼分析與自定義許可權Django原始碼
- android動態許可權到自定義許可權框架Android框架
- 選單許可權和按鈕許可權設定
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- hadoop自定義許可權Hadoop
- Oracle使用者角色許可權管理Oracle
- DRF內建許可權元件之自定義許可權管理類元件
- Linux使用者與許可權Linux
- 許可權系統:一文搞懂功能許可權、資料許可權
- MongoDB 使用者與許可權管理MongoDB
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- 如何檢查某個使用者是否具有某個許可權物件上定義的某種許可權物件
- ubuntu 許可權管理設定Ubuntu
- NAS使用者許可權的設定
- PostgreSQL物件許可權如何在後設資料中獲取-許可權解讀、定製化匯出許可權SQL物件
- SpringSecurity:hasAuthority與自定義許可權校驗SpringGse
- mysql許可權MySql
- 許可權控制
- Linux許可權Linux
- linux使用者許可權Linux
- Oracle軟體許可權修復Oracle
- Linux的檔案存取許可權和0644許可權Linux
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- 【自然框架】許可權的視訊演示(二):許可權到欄位、許可權到記錄框架
- 入門MySQL——使用者與許可權MySql
- MySQL入門--使用者與許可權MySql
- MYSQL學習筆記13: DCL許可權控制(使用者許可權操作)MySql筆記
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- 小程式許可權設定(位置)
- Linux 如何設定特殊許可權?Linux
- 許可權系統:許可權應用服務設計
- windows10許可權怎麼設定_win10設定使用者許可權的方法WindowsWin10
- mysql使用者許可權管理MySql
- Odoo許可權管理Odoo
- shiro許可權控制
- vue router 許可權Vue