2010-03-02 6 views
6

시퀀스가 ​​있으면 어떤 table.column이 값을 가져올 지 알아야합니다. 내가 아는 한, 오라클은이 관계를 추적하지 않습니다. 따라서 소스 코드에서 시퀀스를 찾는 것이 유일한 방법입니다. 그게 맞습니까?시퀀스를 사용하는 Oracle 테이블은 무엇입니까?

누구나이 시퀀스 - 테이블 관계를 알아낼 수있는 방법을 알고 있습니까?

+1

오라클은 관례에 의한 경우를 제외하고 그러한 관계가 없으므로 추적하지 않습니다. 이것이 일반적으로 일종의 명명 규칙을 사용하는 이유입니다. 테이블 XYZ에는 시퀀스 SEQ_XYZ가 있습니다. –

답변

2

찾고있는 사람이이 같은 스키마에 저장된 모든 코드를 검색 할 수있는 myseq -

+0

"MYSEQ 선택. 이중에서 NEXTVAL FROM"과 같은 사례는 처리하지 않습니다. – jva

+0

사실, 항상 텍스트 검색에 문제가 있습니다. '% MYSEQ %. % NEXTVAL %'을 (를) 사용할 수 있지만 'MYSEQ2.NEXTVAL'과 같은 항목에 대해 오탐을 유발할 수 있습니다. 그 쉬운 대답은 없습니다! –

2

트리거에서 시퀀스를 사용하는 경우 트리거는 시퀀스의 "참조 기준"목록에 나열됩니다.

시퀀스가 ​​소스 코드 쿼리에서만 사용되는 경우 예보다 코드를 탐색하는 것이 유일한 방법입니다. : 데이터베이스에 대한 ....

+0

저장 프로 시저'sp_something'이 'seq_something' 시퀀스를 참조하면'seq_something '의'referenced by '목록에'sp_something '이 나타날 것입니까? – mcrisc

+0

@ Jaú : 그렇습니다. – Quassnoi

1

사용 GREP은 "myseq.NextVal"에 대한 전체 소스를 스캔

select type, name, line, text 
from all_source 
where owner = 'MYSCHEMA' 
and upper(text) like '%MYSEQ.NEXTVAL%'; 

SQL Developer에는이를 수행하는 보고서가 있습니다.

+0

그건 내 접근 방식이되어 왔습니다. 'grep -Prine "myseq \." 전체 코드베이스에서. " 문제는 사람들이 버전 제어하에 모든 코드를 가지고 있지 않다는 것입니다. 나는 많은 코드 (절차)가 데이터베이스에만 저장되어 있다고 생각한다. – mcrisc

+0

DB에 저장된 코드 만 참조 할 수 있다면'ALL_SOURCE'를 시도해보십시오. 10g이면'REGEXP_LIKE' 함수를 사용하여 검색합니다. – Guru

+0

@ 구루 9i입니다. 하지만 어쨌든'REGEX_LIKE'에 대해 알고있는 것이 좋습니다. 감사. – mcrisc

7

오라클은 한 시퀀스를 사용하여 여러 테이블의 열을 채울 수 있습니다. 이것이 바람직 할 수있는 시나리오는 수퍼 타입 ​​/ 서브 타입 구현을 포함한다.

데이터 딕셔너리의 종속성을 사용하여 관계를 식별 할 수 있습니다. 당신이 값을 할당 트리거를 사용하는 경우 예를 들어,이 쿼리는 당신을 도울 것입니다 : 당신은 PL/SQL을 사용하는 경우

select ut.table_name 
     , ud.referenced_name as sequence_name 
from user_dependencies ud 
     join user_triggers ut on (ut.trigger_name = ud.name) 
where ud.type='TRIGGER' 
and ud.referenced_type='SEQUENCE' 
/

은 다음 TYPE in ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION') 비슷한 무언가를 쓸 수 있습니다, 당신은 여전히 ​​소스를 통해 일부 트롤 어업을 필요로하지만, 여러 개의 히트가있을 때 테이블과 시퀀스를 할당하는 코드.

+0

sequence_name이 있고 트리거를 통해 사용중인 테이블을 확인하려면 위의 쿼리에 시퀀스 이름을 지정하는 하나 이상의 "and"조건을 사용할 수 있습니다. select ut.table_name , ud.referenced_name as sequence_name from user_dependencies ud user_triggers ut on (ut.trigger_name = ud.name) ud.type = 'TRIGGER' 및 ud.referenced_type = 'SEQUENCE' 및 ud.referenced_name = 'YOUR_SEQ_NAME'; – nanosoft

0

시퀀스에 대한 정보를 background에 추가하고 싶습니다.

관련 문제