프로시져 안에서 통계정보생성(dbms_stats.gather_table_stats)시 다른 계정의 테이블을 부르고자 할때... 0 2 5,275

by 안희영 [PL/SQL] [2011.01.05 10:12:43]



안녕하세요.
궁금한 것이 많은 DB초보자 입니다.
지식이 부족하여 설명이 조금 이상할지라도
전문가분들께서 잘~ 알아들으시고 답변 해주리라 믿습니다.

제가 System계정에서 하나의 프로시져를 만들었습니다.
이 프로시져 안에는 통계정보를 수집하는 dbms_stats.gather_table_stats()실행문을 담고 있습니다.

대략 적자면 이런 식입니다.
create procedure 프로시져명
begin
dbms_stats.gather_table_stats( ownname => 'A', tabname => 'A_TBL',
end;

저 프로시져 안에서 A는 A라는 다른 계정을 의미하고 A_TBL은 A계정 안에 있는 테이블을 의미합니다.
 
프로시져를 돌리면 다음과 같은 에러가 발생합니다.
========================================
ORA-20000: Unable to analyze TABLE "A"."A_TBL", insufficient privileges or does not exist
ORA-06512: "SYS.DBMS_STATS", 줄 13427에서
ORA-06512: "SYS.DBMS_STATS", 줄 13457에서
ORA-06512: "SYSTEM.프로시져명", 줄 64에서
ORA-06512: 줄 1에서
========================================
아마도 system계정에서 A계정의 A_TBL에 직접 접근하지 못하나 봅니다..
그래서 프로시져를 다음과 같이 작성해 보았습니다.

create procedure 프로시져명
begin
dbms_stats.gather_table_stats( ownname => 'A', tabname => 'A.A_TBL',
end;

하지만 비슷한 에러문구가 발생합니다.
========================================
ORA-20001: A.A_TBL is an invalid identifier
ORA-06512: "SYS.DBMS_STATS", 줄 13437에서
ORA-06512: "SYS.DBMS_STATS", 줄 13457에서
ORA-06512: "SYSTEM.프로시져명", 줄 64에서
ORA-06512: 줄 1에서
========================================

현재 다른 방법이 없어서 A계정에서 프로시져를 만들어서 실행하는 방법으로 대신하려고 했는데
처리해야할 계정이 한두개가 아니고 각 계정마다 동일한 프로시져를 만든다는게 자원 낭비 같아서
이 방법만은 피하고 싶네요.

뭔가 해결 방안이 없을까요??
혹시 좋은 방법 아시는분 꼭꼭 답변 달아주십시요.

수고하시고
오늘도 즐거운 하루 되시길^^
by park1q [2011.01.05 16:05:49]
일단 아래와 같이 SYSTEM PRIVILEGE 를 해당 유져한테 주면..프로시져 안의 DBMS_STATS PACKAGE 호출이 가능합니다.
grant analyze any to system;
이미 DBA 한테도 analyze any 권한이 있는데, 안되는 정확한 이유는 모르겠네요..ㅠㅠ

by 안희영 [2011.01.06 08:17:21]
우선 답변 감사드립니다.
말씀하신 대로 해당 명령어를 실행 후 다시 프로시져를 돌렸는데
같은 에러가 발생하네요.. insufficient privileges or does not exist
임시 방편인 각 계정에 동일한 프로시져를 두는 것으로 해결하였습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입