2010-05-12 3 views
0

실수로 LOG4PLSQL을 잘못된 (즉, SYS) 스키마에 정리하려고합니다. QTAB_LOG이라는 큐 테이블이 사라져야합니다. 나는 성공적으로 중지하고 관련 큐 떨어졌다 :DBMS_AQADM.DROP_QUEUE_TABLE을 사용하여 Oracle 대기열 테이블을 삭제할 수 없습니다.

call DBMS_AQADM.STOP_QUEUE('LOG_QUEUE'); 
call DBMS_AQADM.DROP_QUEUE('LOG_QUEUE'); 

을하지만 큐 테이블 자체를 삭제하는 것은 실패

SQL Error: ORA-00942: table or view does not exist 
ORA-06512: at "SYS.DBMS_AQADM", line 240 
ORA-06512: at line 1 
00942. 00000 - "table or view does not exist" 

그리고 물론

이 테이블을 삭제 :이 오류와

call DBMS_AQADM.DROP_QUEUE_TABLE('QTAB_LOG'); 

정상적인 방법 :

drop table QTAB_LOG; 

은 허용되지 않습니다.

SQL Error: ORA-24005: Inappropriate utilities used to perform DDL on AQ table LOG4PLSQL.QTAB_LOG 
24005. 00000 - "must use DBMS_AQADM.DROP_QUEUE_TABLE to drop queue tables" 
*Cause: An attempt was made to use the SQL command DROP TABLE for queue 
      tables, but DROP TABLE is not supported for queue tables. 
*Action: Use the DBMS_AQADM.DROP_QUEUE_TABLE procedure instead of the 
      DROP TABLE command. 

내가 뭘 잘못하고 있니?

답변

2

이전에 실패한 큐 테이블을 삭제하려고 시도 했습니까? 격리 된 대기열 테이블의 이러한 상황은 일반적으로 AQ API 호출을 사용할 때 예외가 발생하는 일부 문제점의 결과입니다.

도입시기를 알 수 없지만 적어도 11g에 drop_queue_table 호출에 FORCE 매개 변수가있어 drop 테이블 프로세스의 일부로 큐를 중지 및 삭제합니다. 귀하의 경우 그것은 너무 늦어서 작동하기는하지만 시도해 볼만한 가치가있을 수 있습니다. 9i의/10g 일에서

, TNAME때때로 작업에 사용되는 DROP 표 다음에, "세션 설정 이벤트 '영원히 10,851 추적 이름 컨텍스트, 레벨 2를'변경"- 아직도 알고하지 않습니다 할 것이다.

+0

예,'dbms_aqadm' 호출을 순서없이 실행하여 큐 테이블을 삭제하려는 시도가 여러 번 실패했습니다. 당신의 '변경 세션'제안은 나를 위해 11g에서 일했습니다. 매우 도움이됩니다. 감사합니다. –

+0

어. 내 문제를 해결하기 위해 XE (10.2)를 다시 설치했다 : p'DROP USER CASCADE'를 시도하는 동안이 문제로 끝났다. 내 목표가 단순히 전체 사용자/스키마를 삭제하는 것이라면이 작업을 수행하는 더 좋은 방법이 있습니까? –

+0

@ 메린 - 내가 아는 것은 아닙니다. 다시 작성하기 위해이 명령을 사용하여 사용자를 정기적으로 삭제하려면 하나의 솔루션은 대기열을 별도의 스키마로 분리하고 삭제 및 재 작성 될 스키마에 적절한 대기열/대기열 제거 권한을 부여하는 것입니다. – dpbradley

0

바꿔 영원히 세션 설정 이벤트 '10851 추적 이름 컨텍스트 레벨 주어진 2

0

SOLN가 10.2.0.3을 위해 잘 작동 - 드롭을 시도했다 어디에서 우리는 스키마 소유자의 USER_TABLES에 나와있는 큐 테이블을 드롭 할 수 있었다 : 위의 '세션 변경 이벤트 설정'10851 추적 이름 컨텍스트 영원히 사용 후 확인 작동했습니다 ' .

0

나는 oracle 11g r2를 사용합니다. 아래는 나를 위해 잘 작동합니다. 모든 버전이 아래에서 지원되는지 여부는 확실하지 않습니다.

EXEC dbms_aqadm.drop_queue_table (queue_table => '<OWNER>.<QUEUETABLE>',force=>true); 

위의 명령은 관련 대기열을 자동으로 중지하고 삭제 한 다음 대기열 테이블을 삭제합니다.

  1. 중지 관련된 큐 :

    그런 다음 아래 순서대로 그것을 (수동 모두) 모든 단계 자기를 수행 할 경우

    .
  2. 관련 대기열을 삭제하십시오.
  3. 대기열 테이블을 삭제하십시오.

dbms_aqadm pkg 기능을 실행할 수있는 권한이 있다고 가정합니다. 그렇지 않으면이 pkg를 호출하면 오류가 발생합니다. 이것이 의미가 있기를 바랍니다.

+0

내가 위에서 제안한 것은 무엇이든 저에게 여러 번 성공적으로 테스트되었습니다. 그래서, 당신은 그것을 믿을 수 있습니다. –

관련 문제