公有和私有同义词和数据库链路访问
同义词主要是用于访问用户的对象的一种方式,特别是公有同义词可以省去别的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/,如需转载,请注明出处,否则将追究法律责任。