PL/SQL: ORA-00942: table or view does not exist

PL/SQL: ORA-00942: table or view does not exist

PL-SQL scripti içeren bir job, prosedüre 
olustururken asagidaki hatayi alabiliiz.
ORA-12012: error on auto execute of job 222
ORA-06550: line 8, column 18:
PL/SQL: ORA-00942: table or view does not exist

Procedure içerisinde kullandigimiz tablonun oldugundan eminiz ve gerekli yetkiler saglayan role de bulunmakta. Buna ragmen yukardaki hata aliniyor olabilir.

Hatanin nedeni , procedure veya job olustururken farkli bir semanin tablosunu kullanirken DML hakki direk verilmelidir. Bir role ile verilen haklar yukardaki gibi bir sorun olmasina neden olacaktir. Asagidaki gibi bir study case ile sorunu ve çözümü görebiliriz.

**user_a ile login olalim;

create table user_a.test_tablo 
(
id number,
name varchar2(50)
);
Table created.

insert into user_a.TEST_TABLO  values (1,'sss')
1 row inserted.

insert into user_a.TEST_TABLO  values (2,'qwerty');
1 row inserted.

insert into user_a.TEST_TABLO  values (3,'aaaaa');
1 row inserted.

create role test_role;
Role created.

grant select on user_a.test_tablo to test_role; 
Grant succeeded.
 
grant test_role to user_b;
Grant succeeded.

**Simdi user_b ile login olalim;

select * from user_a.test_tablo; --sorunsuz , çalisti
 declare
   v_name varchar2(50);
   begin
   select t.name into v_name from user_a.test_tablo t where t.id=3;
   dbms_output.put_line('3 nolu kayit  :'||v_name);
   end;
   / 
   --PL/SQL procedure successfully completed.

Buraya kadar hiçbir sorun olmadan çalisti. verdigimiz role ile gerekli yetkiler verildiginden sorun olmadi. DML islemini PLSQL içinde veya guery ile kullanirken sorun olmuyor.

create or replace procedure user_b.test_proc as
    v_name varchar2(50);
    begin
    select t.name into v_name from user_a.test_tablo t where t.id=3;
    dbms_output.put_line('3 nolu kayit  :'||v_name);
    end test_proc;  
   / 
 
Warning: compiled but with compilation errors

[Warning] ORA-24344: derleme hatasi ile basardi
4/45    PL/SQL: ORA-00942: table or view does not exist
4/5     PL/SQL: SQL Statement ignored
 (14: 0): Warning: compiled but with compilation errors

Görüldügü gibi procedure içinde daha önce çalistirdigimiz PLSQL olmasina ragmen sorun verdi.

Simdi grantlari role kullanmadan, direk verelim.

grant select on test_tablo to user_b;
Grant complete.

create or replace procedure user_b.test_proc as
    v_name varchar2(50);
    begin
    select t.name into v_name from user_a.test_tablo t where t.id=3;
    dbms_output.put_line('3 nolu kayit  :'||v_name);
    end test_proc;  
   / 

Procedure created.

User_b, veritabaninda dba role sahip olsa bile user_a nin tablosnu bir procedure içerinsde kullnmasi için yine direk grant’a ihtiyaç olur.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir