提几个低级的问题“ORA-00942: 表或视图不存在”

YuccaWei 2009-09-21 10:16:43
最近刚刚接触oracle,遇到很多自认为稀奇古怪的问题,请各位高手不吝赐教:

1.用system登陆的PLSql,创建了表tbTest,查询的时候 SELECT * FROM SYSTEM.TBTEST 可以顺利执行
但SELECT * FROM TBTEST 却报错“表或视图不存在”。为什么会这样?

2.还是上面刚建的那个表TBTEST ,我在C#中连接oracle,用的system登陆,查询语句 不管查SYSTEM.TBTEST 还是TBTEST 又都ok了,不会报错,这里连接与上方连接PLSQL有何不同之处,为什么这里两种情况又都可以了?

3.用system登陆的PLSql,新建了个用户yucca, 角色是dba,为何不能查询TBTEST 表?
grant select any table to yucca 之后yucca才有权限查询表 。那我以后每次需要一个新用户都需要这样grant一次吗?这样太麻烦了。

4.用yucca登陆plSQL,creat 了表 tbYucca,在plSQL内查询select * from tbYucca 没问题,但在C#内使用yucca登陆Oracle,执行刚刚的查询语句也会报“表或视图不存在”,这是怎么回事?

5.在plSQL内看tbYucca的属性,owner居然是sys,这又是为什么?

6.后来在C#内查询 select count(*) from sys.tbYucca 还是会报错“表或视图不存在 ” 

我快绝望了。
...全文
4772 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
inthirties 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wildwave 的回复:]
引用 12 楼 yuccawei 的回复:
自己又捣鼓了捣鼓,总算明白一点了
总结了以下几点
1.使用自己创建的用户登录时,需要登陆模式为"标准"(nomal),这样创建的表的拥有者就是他自己了。
2.不管哪个用户只要是使用dba方式登录PL/sQL创建的表的拥有者都是sys
3.一般报错“表或视图不存在”,除非这个表或视图真不存在,问题一般是权限的问题。把用户的权限之类的理吧清楚了,就不会有这种问题了。


再次感谢inthirties!

这个理解..不太正确
1.创建的表的拥有者本来就是创建者自己。只不过你以sysdba登录的时候,你登录的就是sys账户,拥有者和创建者都是sys
2.企业版在本机上默认有两种验证方式,当你以sysdba方式登录的话,是以os方式验证,登入sys。若你将这个验证方式去掉,则不会出现这种情况
3.你的表名和视图名之前不加用户名的话,查出来的是自己用户下的表和视图,提示表或视图不存在,就是在当前用户下不存在。若你在表名前加上一个用户名,而且该用户名下有这张表,那么如果出现该提示,可能是权限问题。
[/Quote]

lz这里的总结和你说的并不矛盾。
1.使用自己创建的用户登录时,需要登陆模式为"标准"(nomal),这样创建的表的拥有者就是他自己了。

确实,以normal的方式,就可以把表创建到自己的schema里,只要你不指定一个schema的话。sysdba和sysoper
这两个特殊身份,一般是用来管理和维护的。不要用他们来创建表和其他对象。

2. 不管哪个用户只要是使用dba方式登录PL/sQL创建的表的拥有者都是sys
这个也是正确的,不过有错误的是,是使用sysdba,不是dba,dba和sysdba的区别可以看另外一个文章,用sysdba登录的schema就是sys叻,所以拥有者就是sys了。 这个和wildwave兄弟解答是说的sysdba认证方面的问题,描述也是正确的,不过和lz解答的是两码事。

3.般报错“表或视图不存在”,除非这个表或视图真不存在,问题一般是权限的问题。把用户的权限之类的理吧清楚了,就不会有这种问题了。
这里也是对的,wildwave兄弟说的不同schema的问题,其实属于表不存在的问题。确实别的schema的对象在你的schema里是没有的。 也有可能你加了schema,但是表名写的不对,还是报 不存在的错呀。

YuccaWei 2009-09-22
  • 打赏
  • 举报
回复
哦明白了,谢谢哈
小灰狼W 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yuccawei 的回复:]
自己又捣鼓了捣鼓,总算明白一点了
总结了以下几点
1.使用自己创建的用户登录时,需要登陆模式为"标准"(nomal),这样创建的表的拥有者就是他自己了。
2.不管哪个用户只要是使用dba方式登录PL/sQL创建的表的拥有者都是sys
3.一般报错“表或视图不存在”,除非这个表或视图真不存在,问题一般是权限的问题。把用户的权限之类的理吧清楚了,就不会有这种问题了。


再次感谢inthirties!
[/Quote]
这个理解..不太正确
1.创建的表的拥有者本来就是创建者自己。只不过你以sysdba登录的时候,你登录的就是sys账户,拥有者和创建者都是sys
2.企业版在本机上默认有两种验证方式,当你以sysdba方式登录的话,是以os方式验证,登入sys。若你将这个验证方式去掉,则不会出现这种情况
3.你的表名和视图名之前不加用户名的话,查出来的是自己用户下的表和视图,提示表或视图不存在,就是在当前用户下不存在。若你在表名前加上一个用户名,而且该用户名下有这张表,那么如果出现该提示,可能是权限问题。
YuccaWei 2009-09-22
  • 打赏
  • 举报
回复
自己又捣鼓了捣鼓,总算明白一点了
总结了以下几点
1.使用自己创建的用户登录时,需要登陆模式为"标准"(nomal),这样创建的表的拥有者就是他自己了。
2.不管哪个用户只要是使用dba方式登录PL/sQL创建的表的拥有者都是sys
3.一般报错“表或视图不存在”,除非这个表或视图真不存在,问题一般是权限的问题。把用户的权限之类的理吧清楚了,就不会有这种问题了。



再次感谢inthirties!
YuccaWei 2009-09-22
  • 打赏
  • 举报
回复
如下
[Quote]
在plSQL内看tbYucca的属性,owner居然是sys,这又是为什么?
你的tbYucca登录的时候,用的是as sysdba的方式,这种方式的schema是 SYS,既是用户SYS
[/Quote]
那用户yucca怎样登陆创建的表才属于他自己呢?
请高手解惑。多谢
soft53ears 2009-09-22
  • 打赏
  • 举报
回复
偶是来打酱油学习了...

6楼回答好认真啊~~~
wh62592855 2009-09-21
  • 打赏
  • 举报
回复
没有搞清楚schema这个概念
inthirties 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuccawei 的回复:]
最近刚刚接触oracle,遇到很多自认为稀奇古怪的问题,请各位高手不吝赐教:

1.用system登陆的PLSql,创建了表tbTest,查询的时候 SELECT * FROM  SYSTEM.TBTEST 可以顺利执行
但SELECT * FROM  TBTEST 却报错“表或视图不存在”。为什么会这样?

2.还是上面刚建的那个表TBTEST ,我在C#中连接oracle,用的system登陆,查询语句 不管查SYSTEM.TBTEST 还是TBTEST 又都ok了,不会报错,这里连接与上方连接PLSQL有何不同之处,为什么这里两种情况又都可以了?

3.用system登陆的PLSql,新建了个用户yucca, 角色是dba,为何不能查询TBTEST 表?
grant select any table to yucca 之后yucca才有权限查询表 。那我以后每次需要一个新用户都需要这样grant一次吗?这样太麻烦了。

4.用yucca登陆plSQL,creat 了表 tbYucca,在plSQL内查询select * from tbYucca 没问题,但在C#内使用yucca登陆Oracle,执行刚刚的查询语句也会报“表或视图不存在”,这是怎么回事?

5.在plSQL内看tbYucca的属性,owner居然是sys,这又是为什么?

6.后来在C#内查询 select count(*) from sys.tbYucca 还是会报错“表或视图不存在 ”

我快绝望了。

[/Quote]

1.用system登陆的PLSql,创建了表tbTest,查询的时候 SELECT * FROM SYSTEM.TBTEST 可以顺利执行
但SELECT * FROM TBTEST 却报错“表或视图不存在”。为什么会这样?

可以用show user命令,看看当前用户的schema,如果你SYSTEM.TBTEST可以访问,但是TBTEST不能访问是shcmea不同的问题

2.还是上面刚建的那个表TBTEST ,我在C#中连接oracle,用的system登陆,查询语句 不管查SYSTEM.TBTEST 还是TBTEST 又都ok了,不会报错,这里连接与上方连接PLSQL有何不同之处,为什么这里两种情况又都可以了?

你用C#连接的时候,是用的system做用户名的,所以scheam是SYSTEM,所以都可以连接

3.用system登陆的PLSql,新建了个用户yucca, 角色是dba,为何不能查询TBTEST 表?
grant select any table to yucca 之后yucca才有权限查询表 。那我以后每次需要一个新用户都需要这样grant一次吗?这样太麻烦了。

不需要,dba的权限过大,要查询表,可以用select any table的系统权限,或者针对于当个对象的对象权限比如select on SYSTEM.TBTEST, 一般的用户,我们都指定connect, resource这两个角色权限,比如grant connect, resource to newuser;



4.用yucca登陆plSQL,creat 了表 tbYucca,在plSQL内查询select * from tbYucca 没问题,但在C#内使用yucca登陆Oracle,执行刚刚的查询语句也会报“表或视图不存在”,这是怎么回事?

还是schema的问题


5.在plSQL内看tbYucca的属性,owner居然是sys,这又是为什么?
你的tbYucca登录的时候,用的是as sysdba的方式,这种方式的schema是 SYS,既是用户SYS

6.后来在C#内查询 select count(*) from sys.tbYucca 还是会报错“表或视图不存在 ” 
sys的用户需要单独由SYS附对象权限才行。

问题总结

主要是schema的问题,要不通过shcmea.TBTEST这样的形式反问表,必须是scheam和当前schema一致的情况下,

可以通过show user查看当前schema
Dave 2009-09-21
  • 打赏
  • 举报
回复

楼主好像没有弄清楚表和用户之间的关系

你用用户A建的表,就属于用于A,如果没有授权给用户B,用用户B是查询不到这个表的. 就会报表或视图不存在..

一般在项目中,都会新建个用户,然后把所有的表建在这个用户下..
littlebirds 2009-09-21
  • 打赏
  • 举报
回复
请楼主注意单引号,双引号的用法。另外表名须同建表时的表的大小写一致。
csuxp2008 2009-09-21
  • 打赏
  • 举报
回复
你用yucca用户登陆plSQL的时候肯定不是选择的normal方式
小灰狼W 2009-09-21
  • 打赏
  • 举报
回复
不要将表建在sys,system用户下
进行一般操作不要as sysdba登录
要用Normal模式
wangyong174013 2009-09-21
  • 打赏
  • 举报
回复
以sysdba方式登录任何账户都是进入sys模式下
wh62592855 2009-09-21
  • 打赏
  • 举报
回复
你用哪个USER创建的表,默认就在该SCHEMA下
YuccaWei 2009-09-21
  • 打赏
  • 举报
回复
请问 inthirties,关于schema我怎么控制保证创建的table都在同一个schema内呢?
就如

[Quote]
4.用yucca登陆plSQL,creat 了表 tbYucca,在plSQL内查询select * from tbYucca 没问题,但在C#内使用yucca登陆Oracle,执行刚刚的查询语句也会报“表或视图不存在”,这是怎么回事?

还是schema的问题
[/Quote]
这里为什么schema会不同呢?请高手详解

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧