20 Ocak 2011 Perşembe

ORA-00942: table or view does not exist - Neden?

Merhabalar,

Arama istatistiklerini incelerken başlıktaki aramanın google'da yapıldığını gördüm. Konuyla ilgili ufak bir yazı yazmak istiyorum ve kaynağının neler olabileceğini göstereceğim.

Hatayı ilk gördüğünüzde aklınıza gelen bu objenin gerçekten de veritabanında olmadığı olabilir. Evet, olmayabilir ama ola da bilir. Oracle'ın data dictionary'si içerisinde gerçekten bu objenin olup olmadığı, komutu koşan kullanıcının eğer bu obje varsa ona erişme hakkının olup olmadığı ve bu obje için bir synonym yaratılmış mı bunlara bakılıyor.

SQL> create user ogan identified by password;

User created.

SQL> grant connect, resource to ogan;

Grant succeeded.


SQL> select count(*)
  2  from dba_users;

  COUNT(*)
----------
       126


SQL> conn ogan/password;
Connected.


SQL> create table ogan_yetki_deneme
2 as
3 select * from dba_users;
select * from dba_users
              *
ERROR at line 3:
ORA-00942: table or view does not exist

DBA_USERS objesinin veritabanında olmaması gibi bir şey söz konusu mu? Yukarıdaki örnekte değil çünkü bu obje data dictionary içerisinde bulunuyor ve sahibi SYS kullanıcısı. 

SQL> grant select on dba_users to ogan;

Grant succeeded.

SQL> conn ogan/password;
Connected.
SQL> create table ogan_yetki_deneme
  2  as
  3  select * from dba_users;

Table created.

Başka bir yöntem;

SQL> conn /as sysdba
Connected.
SQL> revoke select on dba_users from ogan;

Revoke succeeded.

SQL> grant select_catalog_role to ogan;

Grant succeeded.

SQL> conn ogan/password;
Connected.
SQL> drop table ogan_yetki_deneme purge;

Table dropped.

SQL> create table ogan_yetki_deneme
  2  as
  3  select * from dba_users;

Table created.

Göstermek istediğim konu koştuğunuz sorguların FROM ifadesinde bulunan objeler için alacağınız ORA-00942 hatasının tek nedeninin objenin gerçekten veritabanı içinde olmaması olmayabileceği.

SQL> conn /as sysdba
Connected.

SQL> revoke select_catalog_role from ogan;

Revoke succeeded.

SQL> create public synonym dba_kullanici for dba_users;

Synonym created.

SQL> conn ogan/password;
Connected.

SQL> create table ogan_yetki_deneme
  2  as
  3  select * from dba_kullanici;
select * from dba_kullanici
              *
ERROR at line 3:
ORA-00942: table or view does not exist

--> synonym public ama onu seçmek için hakkımız yok!

SQL> conn /as sysdba
Connected.

SQL> grant select on dba_kullanici to public;

Grant succeeded.

SQL> conn ogan/password;
Connected.

SQL> create table ogan_yetki_deneme
  2  as
  3  select * from dba_kullanici;

Table created.

--> Burada da public synonym üzerinden bir okuma gerçekleştirildi. Objenin varlığının sorgulanması sorunsuz yapıldı ve objeye synonym aracılığı ile ulaşıldı.

SQL> conn / as sysdba
Connected.
SQL> create table bu_tablo_varmi
  2  as
  3  select * from user_directories;
select * from user_directories
              *
ERROR at line 3:
ORA-00942: table or view does not exist

SQL> select *
  2  from dba_objects
  3  where object_name = 'USER_DIRECTORIES';

no rows selected

SQL> select owner, object_name
  2  from dba_objects
  3  where object_name = 'DBA_USERS';

OWNER             OBJECT_NAME
-------------------------------------
SYS                     DBA_USERS


Bir objenin sorgulanması sonrasında ORA-00942 hatası alınıyorsa, ilk önce bu objenin gerçekten o şema içerisinde var olup olmadığına bakmak gerekiyor. Ardından bu obje için bir private veya public synonym yaratılmış mı ve bunları kullanmaya ilgili kullanıcının yetkisi var mı bunlara bakabilirsiniz. Şema dışında kalan bir durum ise ve objenin varlığı söz konusu ise gerekli yetkilendirmenin talebinde bulunabilirsiniz.

Bu arada hatanın Türkçe karşılığı;

ORA-00942: tablo veya görüntü mevcut degil

İyi çalışmalar.

Ogan

2 yorum:

Mevlüt Altunay dedi ki...

Merhaba ,

Bu hatayı bazen alıp bazen almama konusunda ki yorumunuz nedir ? Yazdığım uygulamada herşey güzel giderken birden oracle bu hatayı veriyor.Yoğun raporlama yapıyorum.

User locka düşmüş olabilir mi ?

mirror dedi ki...

merhabalar. ben de bu hatayı, Envers kullanarak Audit kayıtları oluştururken alıyorum. ne asıl tabloya ne de audit tablosuna bi şey yazmaya izin veriyor. acaba Envers için de bi yetkilendirme mi gerekiyor?

Takip et: @oganozdogan