公有私有synonym中的許可權實際指向和dblink中global_names和許可權封裝

dotaddjj發表於2011-07-22
公有和私有同義詞和資料庫鏈路訪問
同義詞主要是用於訪問使用者的物件的一種方式,特別是公有同義詞可以省去別的user例如select * from user.tablename,
dba最常用的做法就是先grant select username.tablename,然後建public synonym賦予相應的select synonym或者本表,其實就是授予select synonym也實際上授予的是本表
如果同義詞和本表的name相同,預設的是優先訪問本表,然後私有同義詞,最後公有同義詞
下面涉及到同義詞的一些細節的地方都是本人測試的結果 oracle 10G 10.2.0
drop public synonym r$user 刪除public synonym
drop synonym r$user 刪除私有public synonym
建立遠端dblink的table的synonym
create or replace public synonym r$user_syn for
授權涉及到遠端資料庫的同義詞時
grant select on r$user_syn to syn
出現不允許對dblink的資料庫進行ddl操作ora-02021
建立使用者的objects下的同義詞生成的sql,個人覺得這個sql雖然大家都能寫出來,但是未必能想到
select 'create synonym'||object_name||'for abc.'||object_name||';' from user_objects
where object_type in ('TABLE','VIEW','PROCEDURE','TRIGGER','FUNCTION','PACKAGE')
刪除同義詞必須是同義詞的建立者或者有drop any synonym的許可權的user
建立public synonym
create public synonym inf_apply_syn for inf_apply
但是此時別的user還是不能訪問
select * from inf_apply_syn
授予select on synonym_name的許可權就可以了
grant select on inf_apply_syn to syn
建立私有同義詞
create or replace synonym student_syn for student
同樣訪問私有synonym也需要授權user訪問synonym_name的許可權
grant select on student_syn to syn
私有synonym必須指定user
select * from ashuang.student_syn
以上看出可能同義詞對應的還是真正存在的table view等,所以訪問同義詞還是實際訪問的table,view等,所以你必須有訪問實際物件的許可權,
不然即使grant select on synonym_name to user此user也是無權訪問的,現在也就可以解釋上面的無法對dblink的資料庫進行ddl操作。
因為你實際ddl操作的物件不是同義詞還是dblink的資料庫表,沒有遠端資料庫訪問的許可權肯定也就無法授權select遠端資料庫的表。
既然提到了資料庫鏈路
create public|database link database_link_name
connect to username identified by password
using 'service_name'
注意上面的這個service_name是tns檔案中的資料庫服務的別名
建立資料庫連結的帳號必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASELINK的系統許可權,
用來登入到遠端資料庫的帳號必須有CREATE SESSION許可權。這兩種許可權都包含在CONNECT角色中(CREATEPUBLIC DATABASE LINK許可權在DBA中)。
一個公用資料庫連結對於資料庫中的所有使用者都是可用的,而一個私有連結僅對建立它的使用者可用。
由一個使用者給另外一個使用者授權私有資料庫連結是不可能的,一個資料庫連結要麼是公用的,要麼是私有的。
上面的私有dblink不等同於私有的synonym,私有的synonym是可以透過grant select on synonym_name to username來授權訪問的
但是私有的dblink不可能授權另一使用者。
此外還有一個引數需要注意global_names
sql>show parameter global_names
預設的是false
此時false值並不要求database link name和遠端資料庫name一致。
但是為TRUE時就會要求了此時database link name必須要於遠端資料庫select * from global_name;
此時如果select count(*) from ;
ORA-02085: 資料庫連結 DATABASE_LINK_JHQL 連線到 JHQL
還有關於dblink中涉及到遠端資料庫的lob欄位的物件是無法訪問,關於dblink封裝的許可權網上找不到比較全的資訊。
個人得出dblink是連線到遠端資料庫的指定user,那麼這個遠端的user的所有許可權我們透過dblink的都可以得到,也就是這個user的許可權我們dblink全封裝進去了。
.[@more@]

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

相關文章