AUTHID CURRENT_USER的注意點

梓沐發表於2019-09-26

1.在A和B使用者下同時建立如下測試表和資料
A:
create table tb_test(a varchar2 ( 50 ));
insert into tb_test select 1 from dual;
insert into tb_test select 2 from dual;
insert into tb_test select 3 from dual;
commit ;
B:
create table tb_test(a varchar2 ( 50 ));
insert into tb_test select 1 from dual;
insert into tb_test select 2 from dual;
insert into tb_test select 3 from dual;
commit ;
2.在A下建立儲存過程並授權給B,注意這裡的 AUTHID CURRENT_USER
CREATE OR REPLACE PROCEDURE pd_test
AUTHID CURRENT_USER
IS
BEGIN
  UPDATE tb_test SET a = 'abc' ;
  COMMIT ;
END pd_test;

GRANT EXECUTE ON  pd_test to B;
3.在使用者B下去執行pd_test時,會發現B使用者下的tb_test表資料被更新成abc,而A使用者下的tb_test資料表未被更新
如果不加 AUTHID CURRENT_USER, 則A使用者下的tb_test表資料被更新成abc,而B使用者下的tb_test資料表未被更新

關於 AUTHID CURRENT_USER 的解釋

這是典型的,資料庫中只建立一個儲存過程,所有使用者都可以使用,但是每個使用者使用的時候只是用自己的許可權許可權執行,oracle自己的包很多都這樣的 。 


儲存過程預設是用定義者definer的身份呼叫的,如果加上AUTHID CURRENT_USER,則用當前登陸的使用者許可權呼叫,如果該過程的呼叫者(而非定義者)被授與系統許可權execute any procedure或是被該過程的定義者grant execute on授權的話,不用這個AUTHID CURRENT_USER子句,呼叫者照樣可以使用這個過程。


另外,在Oracle的儲存過程中,如果涉及到操作不同schema下的物件的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步帶來了麻煩。


在procedure中加上authid current_user,來說明procedure中操作的物件是當前連線使用者的物件而並不是procedure所屬使用者下的物件。所以在 procedure中的DML語句也是在當前連線使用者的物件去操作。

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

相關文章