2013-02-25 3 views
3

바로 여기 내 질문입니다.Oracle Express Edition 11gR2 : "테이블 또는 뷰가 존재하지 않습니다"하지만 "dba_tables"에 표시됩니다!

Oracle XE에서 일부 테이블을 생성 한 일부 ETL 도구를 가지고 놀고있었습니다. 그런 다음 테이블에 액세스하거나 삭제할 수 없음을 알았습니다.

스크린 샷에서 볼 수 있듯이 텍스트를 복사/붙여 넣기해야하므로 이미지를 게시 할 수 없습니다. "dba_tables"쿼리는 해당 테이블을 보여 주지만 삭제할 때 Oracle은 "존재하지 않습니다"라고 말합니다.

SQL> select table_name from dba_tables where owner='HR'; 

TABLE_NAME 
------------------------------ 
REGIONS 
LOCATIONS 
DEPARTMENTS 
JOBS 
EMPLOYEES 
JOB_HISTORY 
DetailedOrders 
COUNTRIES 

8 rows selected. 

SQL> drop table HR.DetailedOrders cascade constraints; 
drop table HR.DetailedOrders cascade constraints 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> 

는 또한 시도 : 같은 이름의 빈 테이블을 생성 - 성공! 다음 드롭 - 성공! dba_tables 또는 user_tables를 쿼리하십시오, 아직 있습니다!

알고 계십니까? 어떻게 해결할 수 있습니까?

감사합니다, 당신은 당신이이 명령을 실행할 때로 로그인 한 어떤 사용자

답변

4

제레미?

HR 이외의 사용자로 로그인했다고 가정하면 (아마도 사용자가 생각하는 것처럼) DBA_TABLES을 쿼리하여 테이블이 있지만 사용자에게 권한이 없다는 것을 알 수 있습니다 테이블에 뭐든지 할거야. 이는 귀하의 계정에 SELECT ANY DICTIONARY 권한 또는 SELECT_CATALOG_ROLE 역할과 같은 권한이 부여되었지만 명시 적으로 hr.DetailedOrders에 대한 권한이 부여되지 않았 음을 의미합니다. 권한이없는 테이블로 작업을 시도 할 때 발생하는 오류는 ORA-00942이며 오류 메시지는 실수로 데이터베이스에 존재할 수있는 테이블에 대한 정보를 공격자에게주지 않도록 설계되었습니다 문제가 테이블이 실제로 존재하지 않거나 테이블이 존재하고 권한이 없는지 여부를 알려줌으로써 이로 인해 특히 DBA_TABLES에 대한 액세스가 허용 된 계정을 사용하는 경우 오류가 다소 혼란 스러울 수 있습니다.

"같은 이름의 빈 테이블 만들기"란 무엇을 의미합니까? 현재 스키마에 DetailedOrders 테이블을 만드는 것에 대해 이야기하고 있습니까? 그렇다면 테이블을 떨어 뜨리는 것과 마찬가지로 작동 할 것으로 예상됩니다. 각 스키마는 별도의 네임 스페이스입니다. 원하는 경우 데이터베이스의 모든 스키마에 하나의 DetailedOrders 개체를 포함 할 수 있습니다. 그 중 일부는 테이블 일 수도 있고, 일부는보기 일 수도 있고, 일부는 저장 프로 시저 일 수도 있습니다. 물론 이것은 많은 의미를 갖지는 못하지만, 확실히 할 수 있습니다.

또한 DetailedOrders 테이블은 대/소문자를 구분하는 식별자로 생성 된 것처럼 보입니다. 이것은 끔찍한 생각입니다. 오라클은 기본적으로 대소 문자를 구분하지 않는 식별자를 사용하지만 큰 따옴표로 식별자를 묶는 경우 대소 문자를 구분해야합니다. 다음은 StackOverflow thread that discusses case-sensitive vs. case-insensitive identifiers입니다. 짧은 대답은, 그러나, 당신은 테이블을 삭제하는 기능이 실제로 할 경우, 당신은 테이블의 이름은 큰 따옴표와 케이싱 경기에서 묶여

DROP TABLE HR."DetailedOrders" 

처럼 뭔가를 할 필요가 있다는 것입니다 데이터 사전에 표시되는 케이스. 테이블을 질의 할 때마다이 작업을 수행해야합니다. 대다수의 도구는 대소 문자를 구분하는 식별자를 잘 처리하지 않으며 이후 개발자는 데이터베이스에 대/소문자를 구분하는 식별자를 작성하면 사용자의 이름을 저주합니다. 그러나 당신은 그것을 할 수 있습니다.

+0

감사합니다. 저스틴. 큰 따옴표가 트릭을 만들었습니다! – ZOG

관련 문제