|
原帖由 snow_winter 于 2008-4-2 14:41 发表 ![]()
呵呵,兄弟您你水平高,这样的问题是不屑回答的 -------呵呵, 不屑回答我刚才给你答了那么多,还做了select给你看。谈不上什么水平问题,而是基本概念要搞懂。
那兄弟你解释下 select * from user_tables的时候,查询的是sys的user_tables还是public的user_tables ----查询的是public.user_tables这个公共同义词 ,但是由于它是公共同义词,它指向的是sys.user_tables这个视图,所以你最终查询的数据还是来自sys.user_tables.
为什么select * from user_tables不用加用户前缀 --------因为user_tables有公共同义词。
比如 select * from sys.user_tables;
多谢了
如果看文档都能解决问题,那还要论坛做啥呢? --------很多问题自己深入研究一下是能解决的,如果什么都靠问别人,自己提高很慢的。
一家之言,仅供参考。
同义词 (synonym): 是数据库对象的一个别名,这些对象可以是表,视图,序列,过程,函数,程序包甚至其他同义词.
同义词可以使多个用户使用同一个对象而不用将模式(Schema )作为前缀加在对象的前面,从而简化授权方面的操作。
同义词(synonym)是指向其它数据库表的数据库指针。
同义词有两种类型:私有(private)和公共(public)。私有的同义词是在指定的模式中创建并且只创建者使用的模式访问。公共同义词是由public 指定的模式访问,所有数据库模式(用户)都可以访问它。
用户可以访问其它模式的数据库对象而无需指定模式前缀.
例如:
用户a拥有表tb1, 如果用户a授权给b: grant select on tb1 to b;
那么用户b查询表tb1需要带a的用户名: select * from a.tb1;
如果用户b建立私有同义词:create synonym tb1_pri for a.tb1;
那么用户b查询表tb1的时候就不需要再带模式前缀a: select * from tb1_pri;
如果用户b建立了公有同义词: create public synonym tb1_pub for a.tb1;
而且a授权给c : grant select on tb1 to c ;
那么c用户查询tb1的时候可以直接引用tb1_pub
当然用户a也可以自己为表tb1建立公共同义词,并将公共同义词的select权限赋给别的用户。
[ 本帖最后由 beyond_sea 于 2008-4-2 14:57 编辑 ] |
|