ORACLE 儲存過程中的Authid Current_User

lhrbest發表於2017-03-16
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子句,呼叫者照樣可以使用這個過程。

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

相關文章