oracle访问公有同义词权限,公有私有synonym中的权限实际指向和dblink中global_names和权限封装...

公有和私有同义词和数据库链路访问

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值