Oracle이있는 다른 스키마의 테이블에 열에 열의 존재를 어떻게 저렴하게 검증합니까?

StackOverflow https://stackoverflow.com/questions/1646953

문제

환경은 Oracle 9 & 10입니다. DBA 레벨에 액세스 할 수 없습니다.

문제는 특정 열이 다른 스키마의 특정 표에 존재하는지 확인하는 것입니다.

다루어야 할 두 가지 사례가 있습니다.

  1. 동일한 인스턴스의 다른 스키마
  2. DB_LINK를 사용하여 다른 인스턴스의 스키마

내 스키마 Fred와 다른 스키마 Barney를 감안할 때, 나는 다음과 같은 것을 시도했습니다.

SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'

양보 1] : (오류) : ORA-00942 : 테이블 또는보기가 존재하지 않습니다.

이 시간에 채소를 한 후, 나는 user_tab_cols가 실제로 테이블이 아니라는 것을 깨달았습니다. 그것은 견해입니다. 나는 테이블을 모두 선택했지만보기에서는 아닙니다.

DB_LINK로 똑같은 것을 시도했고 데이터가 돌아 오는 것을보고 놀랐습니다. DB_LINK에는 내장 Schema_Name/Password가 포함되어 있으므로 다른 스키마에 효과적으로 로그인하여 뷰에 도달 할 수 있도록 작동하는 것이 합리적입니다.

Oracle Doc의 산에서 내 안구를 닳게하고, 나는 올바른 방향으로 나를 가리키거나 적어도 내가 놓친 것을 지적 할 사람을 찾고 있습니다.

특정 열이 존재하는지 확인하기 위해 동일한 인스턴스의 스키마에서 사용자 테이블 관련 메타 데이터를 얻는 데 사용할 수있는 기술은 무엇입니까?

미리 감사드립니다.

사악한.

좋은 답변 +1. 고맙습니다.

도움이 되었습니까?

해결책

다른 답변과 마찬가지로 일반적으로 나는 이와 같은 쿼리에 All_Tab_columns를 사용합니다. 그러나 그것은 당신이 선택한 테이블의 열만 표시됩니다. 그리고 해당 열에서 선택합니다.이 테이블의 열 수준 권한을 구현했을 가능성이없는 이벤트에서는 테이블을 볼 수 있지만 관심있는 특정 열을 볼 수는 없습니다. 우리 대부분에게는 매우 드 rare니다.

DBA_TAB_COLUMNS에는 모든 열이 표시되지만 DBA에 의해 스키마에 부여 된 것을 선택해야합니다. (실제로는 All_tab_columns에 대한 보조금이 필요하지만 대부분의 상점에서 일반적입니다). DBMS_METADATA PL/SQL 내장 패키지도 비슷한 제한으로 사용할 수 있지만 더 복잡하다고 생각합니다.

물론 Barney.some_table.some_column@my_dblink (또는 관심있는 부분)에서 레코드를 선택할 수도 있습니다. 그런 다음 예외를 처리합니다. 못생긴, 나는 대부분의 상황에서 그것을 추천하지 않을 것입니다.

다른 팁

다음 쿼리를 사용할 수 있습니다.

SELECT 1
FROM ALL_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
  AND OWNER = 'BARNEY';

(user_tables 및 user_tab_cols는 all_tables와 all_tab_coumns에 대한보기 일뿐입니다. where owner = <Current User> 그것에 첨부)

Barney의 some_table을 볼 수 있다면 (즉, 최소한 선택 권한을 부여 받았다), 열이 있는지 알 수 있습니다. 테이블에 대한 권리가 없다면 메타 정보를 얻을 수 없습니다.

당신은 그것을 위해 all_tab_columns를 사용합니다.

그러나 당신이 볼 수있는 것만 볼 수 있다고 조심하십시오.

동일한 인스턴스, 다른 스키마 :

Select Count(*)
From   all_tab_cols
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

Count (*)는 항상 1 또는 0의 값으로 단일 행을 항상 반환하는 이점이 있으므로 처리 할 필요가 없습니다. NO_DATA_FOUND PL/SQL의 오류.

DB 링크에서 연결하는 것과 동일한 스키마를 통해 다음과 같은 스키마

Select Count(*)
From   user_tab_cols@MY_DB_LINK
Where  table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

DB 링크를 통해 연결된 스키마와 다른 스키마와 다른 스키마를 연결합니다.

Select Count(*)
From   all_tab_cols@MY_DB_LINK
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top