ORACLE 儲存過程中的Authid Current_User
ORACLE使用者具有DBA許可權,卻會出現無法在儲存過程裡面建立一張普通表的現象。因為即使使用者擁有DBA許可權,使用者擁有的role許可權在儲存過程是不可用的。
遇到這種情況,通常解決方法是進行顯式的許可權分配: grant create table to user a;
但這種方法太麻煩,因為有可能執行一個儲存過程,需要很多不同許可權。
實際上,oracle給我們提供了在儲存過程中使用role許可權的方法:修改儲存過程,加入Authid Current_User進行許可權分配。
在ORACLE8i以前的版本,所有已編譯儲存物件,包括packages, procedures, functions, triggers, views等,只能以定義者(Definer)身份解析執行;
而ORACLE8i及其後的新版本,Oracle引入呼叫者(invoker)許可權,使得物件可以以呼叫者身份和許可權執行。
目前ORACLE儲存過程預設都是使用定義者許可權呼叫,以定義者身份執行;而宣告Authid Current_User後則就是呼叫者許可權,以呼叫者身份執行。
定義者許可權:如果在user a下建立的procedure,那其他user只要能執行procedure,這個procedure所做的內容都是以user a的名義來執行的。因為user a是procedure的定義者。user a能做什麼,那這個procedure就能做什麼。
呼叫者許可權:如果在user a下建立的procedure,那其他user只要能執行procedure,這個procedure所做的內容都是以當前user的名義來做的。如果某個table只有user a有許可權建,那這個procedure在user a下面才執行成功。其他user下是不成功的。
而Authid Current_User即是以擁有當前會話許可權、以執行過程的使用者的許可權來處理涉及的物件許可權。
在Oracle的儲存過程中,如果涉及到操作不同schema下的物件的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步麻煩,
在procedure中加上authid current_user,來說明procedure中操作的物件是當前連線使用者的物件而並不是procedure所屬使用者下的物件。
但如果該過程的呼叫者(而非定義者)被授與系統許可權execute any procedure 或是被該過程的定義者grant execute on授權的話,不用authid current_user子句,呼叫者照樣可以使用這個過程。
遇到這種情況,通常解決方法是進行顯式的許可權分配: grant create table to user a;
但這種方法太麻煩,因為有可能執行一個儲存過程,需要很多不同許可權。
實際上,oracle給我們提供了在儲存過程中使用role許可權的方法:修改儲存過程,加入Authid Current_User進行許可權分配。
在ORACLE8i以前的版本,所有已編譯儲存物件,包括packages, procedures, functions, triggers, views等,只能以定義者(Definer)身份解析執行;
而ORACLE8i及其後的新版本,Oracle引入呼叫者(invoker)許可權,使得物件可以以呼叫者身份和許可權執行。
目前ORACLE儲存過程預設都是使用定義者許可權呼叫,以定義者身份執行;而宣告Authid Current_User後則就是呼叫者許可權,以呼叫者身份執行。
定義者許可權:如果在user a下建立的procedure,那其他user只要能執行procedure,這個procedure所做的內容都是以user a的名義來執行的。因為user a是procedure的定義者。user a能做什麼,那這個procedure就能做什麼。
呼叫者許可權:如果在user a下建立的procedure,那其他user只要能執行procedure,這個procedure所做的內容都是以當前user的名義來做的。如果某個table只有user a有許可權建,那這個procedure在user a下面才執行成功。其他user下是不成功的。
而Authid Current_User即是以擁有當前會話許可權、以執行過程的使用者的許可權來處理涉及的物件許可權。
在Oracle的儲存過程中,如果涉及到操作不同schema下的物件的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步麻煩,
在procedure中加上authid current_user,來說明procedure中操作的物件是當前連線使用者的物件而並不是procedure所屬使用者下的物件。
但如果該過程的呼叫者(而非定義者)被授與系統許可權execute any procedure 或是被該過程的定義者grant execute on授權的話,不用authid current_user子句,呼叫者照樣可以使用這個過程。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2135496/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AUTHID CURRENT_USER的注意點
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- jsp中呼叫儲存過程JS儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- MySQL儲存過程中如何使用ROLLBACKMySql儲存過程
- Oracle儲存過程乾貨(二):PLSQL控制語句Oracle儲存過程SQL
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- lightdb新特性--相容oracle儲存過程的聯合陣列Oracle儲存過程陣列
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程
- 儲存過程 傳 datatable儲存過程
- JAVA儲存過程(轉)Java儲存過程
- MySQL之儲存過程MySql儲存過程
- MySQL---------儲存過程MySql儲存過程