UFO ET IT

Oracle이 어떤 테이블이나 뷰가 존재하지 않는지 알려주지 않는 이유는 무엇입니까?

ufoet 2020. 12. 9. 20:56
반응형

Oracle이 어떤 테이블이나 뷰가 존재하지 않는지 알려주지 않는 이유는 무엇입니까?


Oracle을 사용했다면 "ORA-00942 : Table or view does not exist"라는 유용한 메시지가 표시 될 것입니다. 메시지에 누락 된 개체의 이름이 포함되지 않은 합법적 인 기술적 이유가 있습니까?

이 존재에 대한 주장은 TSA에서 만든 것처럼 보안 문제로 들립니다. 내가 공격자라면 내가 방금 악용하려고 시도한 테이블을 알고이 도움이되지 않는 메시지를 쉽게 해석 할 수 있습니다. 여러 계층의 응용 프로그램 코드를 통해 복잡한 조인으로 작업하는 개발자 인 경우 종종 구분하기가 매우 어렵습니다.

내 생각에이 오류가 원래 구현되었을 때 누군가가 객체 이름을 추가하는 것을 소홀히했고 이제 사람들은이를 수정하기 위해 호환성이 깨질 까봐 두려워합니다. (오류 메시지를 구문 분석하는 것과 같은 어리석은 일을하는 코드가 변경되면 혼란 스러울 것입니다.)

누락 된 테이블의 이름을 결정하는 데 개발자 친화적 인 (DBA를 모집하는 것과 반대) 방법이 있습니까?


주제와 관련된 답변을 수락했지만 실제로 내 질문에 대한 답변 이 아닙니다. 이름이 오류 메시지의 일부가 아닌 이유는 무엇입니까? 누구든지 진짜 답을 내놓을 수 있다면 기꺼이 투표를 변경하겠습니다.


매개 변수 파일 (일반 텍스트 또는 spfile)에서 EVENT를 설정하여 Oracle이 user_dump_dest에 자세한 추적 파일을 덤프하도록 할 수 있습니다. SQL이 있어야하는 경우 개체 이름이 거기에있을 수 있습니다.

EVENT = "942 추적 이름 오류 스택 레벨 12"

일반 텍스트 파일을 사용하는 경우 모든 EVENT 설정을 연속 행에 유지해야합니다. 그것이 spfile에 어떻게 적용되었는지 확실하지 않습니다.


SQL * Plus는 존재하지 않는 테이블을 알려줍니다. 예를 들면 :

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

여기에서는 누락 된 테이블의 이름과 오류가 발생한 SQL 문의 행 번호를 보여줍니다.

마찬가지로 한 줄 SQL 문에서 알 수없는 테이블의 이름을 강조하는 별표를 볼 수 있습니다.

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

귀하의 질문과 관련하여 오류 메시지에 테이블 이름이 포함되지 않은 이유는 오류 메시지 자체가 정적 텍스트 여야한다는 것입니다. 오류 줄의 줄 번호와 위치는 SQL * Plus로 명확하게 다시 전달됩니다.


TOAD 또는 TORA와 같은 SQL 검색 도구를 사용하는 경우 강조 표시하거나 커서를 오류가 발생한 위치로 이동하여 ORA 오류를 해결하는 데 도움이됩니다.

이러한 도구 중 하나에 SQL을 복사하여 붙여 넣으면 도움이됩니다. 사용 가능한 분석 정보도 유용 할 수 있습니다.


SQL +를 사용하면 어떤 테이블 이름이 허용되지 않는지 이해할 수 있다는 의견에 동의하지 않습니다. 사실, 파싱은 매우 어렵지만 직접 DML에 도움이됩니다. 그러나 동적에 관해서는 도움이되지 않습니다.

SQL> begin
  2  execute immediate 'insert into blabla values(1)';
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

Oracle 오류 메시지를 해석하는 데 문제가 없었습니다. 그 이유 중 하나는 Oracle 용 SQL을 개발하기 위해 본 모든 대화 형 도구가 쿼리가 잘못된 위치를 유용하게 가리 키기 때문입니다. 여기에는 다른 사람들이 언급했듯이 SQL * Plus와 Perl DBI 모듈이 포함됩니다.

$ exec_sql.pl 'select * from daul'
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in 'select * from <*>daul') [for Statement "select * from daul"] at exec_sql.pl line 68.

글쎄, 그 입니다 그것은 모두 한 줄에 찌그러 이후 약간 하드 읽을 수 있습니다. 그러나 GUI 도구는 Oracle이 쿼리에 문제가 발생하기 시작한 토큰을 가리킬 수 있습니다. 파서에 대한 약간의 작업이 주어지면 문제가되는 테이블을 선택하는 도구를 작성할 수 있습니다.

근본적인 질문에 답하기 위해 Oracle 오류는 예상대로 작동하도록 설계되지 않은 것 같습니다. 내가 말할 수있는 한, Oracle의 오류 메시지는 가변 텍스트를 지원하지 않습니다. 대신 Oracle은 오류 번호와 오류가 발생한 위치의 두 가지 정보를 반환합니다. 적절한 도구가 있으면 이러한 데이터 조각의 오류를 진단하기가 매우 쉽습니다. 오라클의 시스템은 오류에 따라 다양한 양의 진단 데이터를 제공하는 시스템보다 도구 작성자에게 더 좋다고 주장 할 수 있습니다. 문제가되는 위치를 강조하기 위해 Oracle의 모든 오류 메시지 (향후 오류 포함)에 대한 사용자 지정 파서를 작성해야한다고 상상해보십시오.

때때로 테이블 이름을 포함하면 오해의 소지가 있습니다. 어디에서 잘못되었는지 아는 것만으로도 큰 도움이 될 수 있습니다.

SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
              *
ERROR at line 1:
ORA-00903: invalid table name

오라클이 이런 방식으로 일을 선택한 이유에 대해 몇 가지 추측이 있습니다.

  1. IBM은 System R에 대해 이러한 유형의 오류 메시지를 사용했으며 Larry Ellison, Bob Miner 및 Ed Oates는 Oracle V2를 빌드하기 위해 복사했습니다. (하위 호환성.)

  2. 오류 번호와 위치는 진단 정보의 가능한 가장 작은 표현입니다. (간결함.)

  3. 위에서 언급했듯이 Oracle에 연결하는 도구 생성을 단순화합니다. (상호 운용성.)

어쨌든 어떤 테이블이 존재하지 않는지 알아 내기 위해 DBA가 될 필요는 없다고 생각합니다. 적절한 도구를 사용하기 만하면됩니다. (그리고 기대치를 조정하십시오.)


큰 진술이 아니라면 가장 쉬운 방법은 데이터 사전을 확인하는 것입니다.

SQL> select * from xx,abc;
select * from xx,abc
                 *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select owner,table_name from all_tables where table_name in ('XX','ABC');

OWNER                          TABLE_NAME
------------------------------ ------------------------------
MWATSON                        XX

SQL> 

이것은 이상적이지는 않지만 추적 파일을 검사하지 않고 다른 방법을 모르겠습니다.


이유 1 : 다국어 인터페이스

There is a language-specific message configuration file for your database instance. Messages are pulled out of there and translated from the pure numeric version to the numeric+text version.

It was probably considered better to have the hardcoded strings, than to run the risk at runtime of having a mysterious failure due to an improperly formatted "%s" string.

(Not that I particularly agree with this POV, btw.)

Reason 2: Security

Right now you don't particularly expose the internal workings of your application if you print a PHP, etc, dump of an Oracle error message to the browser.

Applications would be a bit more exposed if more detail were printed by default... For example, if citibank printed a more explanatory message.

(see disclaimer above, I would be happy to get more information in the error as well.)


@Matthew

Your query's a start, but it might not work when you have multiple schemas. For example, if I log into our instance as myself, I have read access to all our tables. But if I don't qualify the table name with the schema I'll get an ORA-00942 for tables without synonyms:

SQL> select * from tools; 
select * from tools 
              * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

The table still shows up in all_tables though:

SQL> select owner, table_name from all_tables where table_name = 'TOOLS'; 

OWNER                          TABLE_NAME 
------------------------------ ------------------------------ 
APPLICATION                    TOOLS 

@erikson Sorry that doesn't help much. I'm with Mark - I used TOAD.

참고URL : https://stackoverflow.com/questions/46380/why-doesnt-oracle-tell-you-which-table-or-view-does-not-exist

반응형