Oracle이 존재하지 않는 테이블 또는 뷰를 알려주지 않는 이유는 무엇입니까?
Oracle을 사용한 적이 있는 경우 다음과 같은 유용한 메시지가 나타납니다. "ORA-00942:테이블 또는 뷰가 존재하지 않습니다.메시지에 누락된 객체의 이름이 포함되지 않은 정당한 기술적 이유가 있습니까?
보안에 의한 것이라는 주장은 마치 TSA에 의해 조작된 것처럼 들립니다.만약 내가 공격자라면, 나는 내가 방금 이용하려고 시도한 테이블을 알고 도움이 되지 않는 이 메시지를 쉽게 해석할 수 있을 것이다.복잡한 참여로 작업하는 개발자인 경우 애플리케이션 코드를 여러 층으로 구분하기가 매우 어렵습니다.
이 에러가 처음 실장되었을 때, 누군가가 오브젝트명을 추가하는 것을 게을리 해 버려서, 현재는 호환성이 없어져 버립니다.(에러 메세지의 해석 등, 코드가 바뀌면 혼란이 생깁니다.)
누락된 테이블의 이름을 확인할 수 있는 개발자 친화적인(DBA를 모집하는 것이 아니라) 방법이 있습니까?
주제와 관련된 답변은 받아들였지만 내 질문에 대한 답변은 그렇지 않습니다.왜 이름이 오류 메시지에 포함되지 않는 거죠?정답을 생각해 낼 수 있는 사람이 있다면 기꺼이 제 표를 바꾸겠습니다.
매개 변수 파일(일반 텍스트 또는 spfile)에서 EVENT를 설정하여 Oracle이 user_dump_dest에 상세 추적 파일을 덤프하도록 할 수 있습니다. 그렇지 않으면 개체 이름이 여기에 있을 수 있습니다.
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에 명확하게 반환됩니다(어느 정도).
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
TOAD 또는 TORA와 같은 SQL 브라우징 도구를 사용하는 경우 커서를 강조 표시 또는 포인팅하여 ORA 오류를 해결할 수 있습니다.
SQL을 복사하여 이러한 도구 중 하나에 붙여 넣으십시오.또한 분석 정보도 유용할 수 있습니다.
큰 문장이 아니라면 가장 쉬운 방법은 데이터 사전을 확인하는 것입니다.
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>
이상적이지는 않지만 트레이스 파일을 조사하는 것 외에는 어떻게 해야 할지 모르겠습니다.
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은 오류 번호와 오류가 발생한 위치라는 2비트의 정보를 반환합니다.적절한 툴이 있으면, 이러한 데이터로부터 에러를 진단하는 것은 매우 간단합니다.Oracle의 시스템은 오류에 따라 다양한 양의 진단 데이터를 제공하는 시스템보다 도구 작성자에게 더 좋은 시스템이라고 주장할 수 있습니다.문제가 되는 위치를 강조 표시하기 위해 Oracle의 모든 오류 메시지(향후 오류 포함)에 대해 커스텀 파서를 작성해야 한다고 상상해 보십시오.
테이블 이름을 포함하면 오해를 살 수 있습니다.어디서 문제가 발생했는지 아는 것만으로도 큰 도움이 됩니다.
SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
*
ERROR at line 1:
ORA-00903: invalid table name
Oracle이 이 방법을 선택한 이유에 대해서는 다음과 같은 추측이 있습니다.
IBM은 Larry Ellison, Bob Miner 및 Ed Oates가 Oracle V2를 구축하기 위해 복사한 시스템 R에 이러한 유형의 오류 메시지를 사용했습니다(백워드 호환성).
에러 번호와 장소는 진단 정보의 최소 표시입니다.(간결)
위에서 설명한 바와 같이 Oracle에 접속하는 툴의 작성을 심플화합니다.(상호운용성)
어떤 경우에도 존재하지 않는 테이블을 파악하기 위해 DBA가 될 필요는 없다고 생각합니다.적절한 도구를 사용하면 됩니다.(그리고 기대치를 조정해 주세요.)
이유 1: 다국어 인터페이스
데이터베이스 인스턴스용 언어별 메시지컨피규레이션파일이 있어요여기서 메시지가 추출되어 순수 숫자 버전에서 숫자 + 텍스트 버전으로 변환됩니다.
포맷이 잘못된 %s 문자열로 인해 알 수 없는 오류가 발생할 위험을 런타임에 실행하는 것보다 하드 코드 문자열을 사용하는 것이 더 낫다고 생각되었습니다.
(특별히 이 POV에 동의하는 것은 아닙니다만).
이유 2: 보안
PHP 등의 Oracle 오류 메시지를 브라우저에 덤프하여 출력하는 경우 어플리케이션의 내부 동작은 특별히 노출되지 않습니다.
디폴트에서는, 보다 상세한 정보가 인쇄되고 있는 경우는, 애플리케이션이 조금 더 노출됩니다.예를 들어 씨티은행이 좀 더 설명적인 메시지를 인쇄했다면.
(위의 면책사항을 참조해 주세요.에러에 대한 자세한 정보도 얻을 수 있으면 좋겠습니다.)
@매튜
쿼리는 시작이지만 스키마가 여러 개인 경우 작동하지 않을 수 있습니다.예를 들어, 내가 직접 인스턴스에 로그인하면 모든 테이블에 대한 읽기 액세스 권한이 있습니다.그러나 스키마를 사용하여 테이블 이름을 한정하지 않으면 동의어가 없는 테이블에 대해 ORA-00942를 얻을 수 있습니다.
도구에서 *를 선택합니다.도구에서 *를 선택합니다.*1행 오류:ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.
테이블은 all_tables에 계속 표시됩니다.
SQL > 소유자 table_name from all_displays 를 선택합니다.여기서 table_name = 'TOOLS'; 소유자 테이블_이름------------------------------ ------------------------------응용 프로그램 도구
@erikson. 별로 도움이 되지 않아서 미안해.나는 마크와 함께 있다 - 나는 TOD를 사용했다.
언급URL : https://stackoverflow.com/questions/46380/why-doesnt-oracle-tell-you-which-table-or-view-does-not-exist
'programing' 카테고리의 다른 글
각도 UI 선택 : 원격 서비스에서 데이터 가져오기 (0) | 2023.02.27 |
---|---|
JavaScript 개체를 안정적으로 해시하는 방법 (0) | 2023.02.27 |
DataTable을 다시 초기화할 수 없음 - 데이터 테이블의 동적 데이터 (0) | 2023.02.27 |
WordPress가 IN() 조건으로 준비한 문 (0) | 2023.02.27 |
Angular에서의 ng-repeat 루프 내의 ng-model 바인딩JS (0) | 2023.02.27 |