Oracle이있는 다른 스키마의 테이블에 열에 열의 존재를 어떻게 저렴하게 검증합니까?
-
22-07-2019 - |
문제
환경은 Oracle 9 & 10입니다. DBA 레벨에 액세스 할 수 없습니다.
문제는 특정 열이 다른 스키마의 특정 표에 존재하는지 확인하는 것입니다.
다루어야 할 두 가지 사례가 있습니다.
- 동일한 인스턴스의 다른 스키마
- 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';