oracle关于同一表空间下的不同用户查询问题
我建了一个表空间如YBT然后在这个表空间上建了一个用户如LIS给LIS授DBA和CONNECT角色然后用LIS用户登陆,并导入了一些表和数据。然后在YBT表空间我又建立了...
我建了一个表空间 如YBT
然后在这个表空间上建了一个用户 如 LIS
给LIS授DBA和CONNECT角色
然后用LIS用户登陆,并导入了一些表和数据。
然后在YBT表空间我又建立了一用户 GUEST
授予DBA和CONNECT角色
我用GUEST用户登陆的时候怎样才可以查询到LIS用户的数据?
当然了,也可以通过select * from lis.table1来查询;
但我不想每次查询都带上lis.的标签.
gg152326的答案比较接近
就是说
用DBA的身份登陆然后执行
create or replace synonym guest.lccont for lis.lccont;
这样用guest登陆执行select * from lccont
就可以查询到lis的lccont表,
但是有个问题就是如果lis用户中表非常多,更新也很快,那么同步起来非常困难。
另外,怎么一次性把所有表都同义过来,
如lis.lccont --> guest.lccont
lis.lbcont --> guest.lbcont
lis.lacom --> guest.lacom
再一问题就是,如果guest表中已经有lbcont这个表了,
再执行create or replace synonym guest.lbcont for lis.lbcont;就报错了。
cyy082666 回答非常好。
就是5,如果每次都得拷贝查询结果然后再执行比较麻烦。
有没有一步到位的 展开
然后在这个表空间上建了一个用户 如 LIS
给LIS授DBA和CONNECT角色
然后用LIS用户登陆,并导入了一些表和数据。
然后在YBT表空间我又建立了一用户 GUEST
授予DBA和CONNECT角色
我用GUEST用户登陆的时候怎样才可以查询到LIS用户的数据?
当然了,也可以通过select * from lis.table1来查询;
但我不想每次查询都带上lis.的标签.
gg152326的答案比较接近
就是说
用DBA的身份登陆然后执行
create or replace synonym guest.lccont for lis.lccont;
这样用guest登陆执行select * from lccont
就可以查询到lis的lccont表,
但是有个问题就是如果lis用户中表非常多,更新也很快,那么同步起来非常困难。
另外,怎么一次性把所有表都同义过来,
如lis.lccont --> guest.lccont
lis.lbcont --> guest.lbcont
lis.lacom --> guest.lacom
再一问题就是,如果guest表中已经有lbcont这个表了,
再执行create or replace synonym guest.lbcont for lis.lbcont;就报错了。
cyy082666 回答非常好。
就是5,如果每次都得拷贝查询结果然后再执行比较麻烦。
有没有一步到位的 展开
5个回答
展开全部
1. 你概念没对,不是在表空间上建用户,而是允许用户使用哪个表空间。
2. 你权限没弄对,DBA是最高权限,已经包括connect了。有了DBA权限,整个数据库你就随便搞了。
3. 想查询就通过通过select * from lis.table1来查询。不想总是写一个lis.就建立同义词。
4. 你都有dba权限了,可以建public同义词。这样你的任何用户都可以不用Lis.直接访问那个表了。
select * from table1
但是如果你当前的用户下有同名的表,那么这句话访问的就是你当前用户下的表。一般不要建public,下面这是私有的。
创建方法:
create synonym guest.lccont for lis.lccont
5. 怎么全部重建。这个问题很简单,你拼一个赋权语句就可以了。
select 'create synonym '||table_name||' for lis.'||table_name||';' from dba_tables where owner='LIS';
你把上面这句话的执行结果拷贝出来,执行一遍就全建完了。如果你会不停的创建表,你干脆写个批处理让它自己跑好了。
6. 再一问题就是,如果guest表中已经有lbcont这个表了,
再执行create or replace synonym guest.lbcont for lis.lbcont;就报错了。
那当然了,要不然重名了,你访问这个表的时候怎么知道你访问的是这个表还是同义词。
这个问题无解。
除非建public同义词,那样再访问的话访问的就是你当前用户下的表,而非同义词。
补充:
2搂没对,同义词关db link 什么事?
2. 你权限没弄对,DBA是最高权限,已经包括connect了。有了DBA权限,整个数据库你就随便搞了。
3. 想查询就通过通过select * from lis.table1来查询。不想总是写一个lis.就建立同义词。
4. 你都有dba权限了,可以建public同义词。这样你的任何用户都可以不用Lis.直接访问那个表了。
select * from table1
但是如果你当前的用户下有同名的表,那么这句话访问的就是你当前用户下的表。一般不要建public,下面这是私有的。
创建方法:
create synonym guest.lccont for lis.lccont
5. 怎么全部重建。这个问题很简单,你拼一个赋权语句就可以了。
select 'create synonym '||table_name||' for lis.'||table_name||';' from dba_tables where owner='LIS';
你把上面这句话的执行结果拷贝出来,执行一遍就全建完了。如果你会不停的创建表,你干脆写个批处理让它自己跑好了。
6. 再一问题就是,如果guest表中已经有lbcont这个表了,
再执行create or replace synonym guest.lbcont for lis.lbcont;就报错了。
那当然了,要不然重名了,你访问这个表的时候怎么知道你访问的是这个表还是同义词。
这个问题无解。
除非建public同义词,那样再访问的话访问的就是你当前用户下的表,而非同义词。
补充:
2搂没对,同义词关db link 什么事?
展开全部
在lis用户下,对guest可以访问的表附select权限
grant select on lccont to GUEST
grant select on lccont to GUEST
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用SYNONYMS(同义名)
create or replace public synonym MYTABLE
for PE_DEMO.DDA;
create or replace public synonym MYTABLE
for PE_DEMO.DDA;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-01-13
展开全部
3楼的回答非常好! 学习。收藏之。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建一个database link后再建个同义词不行吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询