2014-06-08 7 views
2

pl/sql 스터디의 일부로 가지고있는 과제는 원격 데이터베이스 연결을 생성하고 모든 테이블을 로컬에서 복사 한 다음, 참조 데이터, 내 견해 및 트리거 등등.오라클 - 저장 프로 시저를 원격 데이터베이스에 복사하기

아이디어는 리모트 쪽에서 뷰 등이 로컬 데이터베이스가 온라인 상태 인 경우 로컬 테이블을 참조해야하며, 그렇지 않은 경우 테이블을 참조해야한다는 아이디어가 있습니다. 원격 데이터베이스에 저장됩니다.

그래서 연결과 원격 끝에 테이블을 만드는 스크립트를 만들었습니다.

필자는 리모트 엔드에서 모든 뷰와 트리거를 생성하기 위해 pl/sql 블록을 만들었습니다. 로컬 데이터베이스에 대해 간단한 선택 쿼리를 실행하여 온라인인지, 온라인인지 확인한 후 일련의 즉시 실행 명령문은 table_name @ local을 참조하여 뷰 등을 만들고 온라인이 아닌 경우 블록은 예외 섹션으로 건너 뜁니다. 예외 섹션에서는 비슷한 일련의 execute immediate 문이 동일한 뷰를 생성하지만 원격 테이블을 참조합니다.

좋습니다. 그래서 여기가 확실하지 않게됩니다. 몇 가지 절차와 함수가 포함 된 패키지가 있는데 원격 대상에서이를 만드는 가장 좋은 방법은 무엇인지 모르기 때문에 참조 테이블을 가져 오는 위치와 비슷한 방식으로 동작합니다. .

보기에 대해했던 것과 같은 방식으로 '즉시 실행'내에 전체 패키지 생성 블록을 묶는 것일까? 아니면 두 개의 다른 패키지를 만들어서 pack1 및 pack1_remote와 같은 이름으로 호출해야합니까? ?

목표를 달성하는보다 효율적인 방법이 의심 스럽습니까?

건배!

+1

로컬 데이터베이스 A와 원격 데이터베이스 B를 호출 해 봅시다. B에서 개체를 만들고 싶습니다. A가 온라인 인 경우 B의 개체가 A의 테이블을 참조하도록하고, 그렇지 않으면 B.에있는 물건은 정확합니까? 그렇다면 컴파일 시간에 그 결정을 내리려고합니까? 아니면 런타임에? 그것은 컴파일 시점에이 결정을하는 것이 거의 의미가 없기 때문에 그 시점은 단일 시점이므로 A가 그 시점에 작동하도록 보장 할 수 있습니다. 런타임에 선택을하면 잠재적으로 유용하지만 뷰 (다른 것들 중에서도)의 사용을 배제 할 수 있습니다. –

+1

런타임에 결정을 내리려는 경우 시스템을 잘못 설계하고 있습니다. 데이터가 동기화되고 코드가 항상 로컬 객체를 참조 할 수 있도록 데이터베이스간에 복제를 작성하려고합니다. 그것은 훨씬 더 안정적이고,보다 성과가 높으며 유지 보수가 가능한 솔루션입니다. –

+0

나는 Justin이 너에게 진실을 말할지 확신하지 못한다. 어쩌면 아이디어는 온라인/오프라인 테스트를 수행하는 스크립트가 사용자 세션 시작시 실행되어야한다는 것입니다. 자세한 내용은 없습니다.이것이 가장 튼튼한 접근 방식이 아닐 수도 있다는 사실에도 불구하고 스토어드 프로 시저/패키지에 대한 생각이 있습니까? – user3704497

답변

1

실제 세계에서 합리적인 사람이 시스템을 설계하는 방법이 절대적으로 아닙니다. 실제 세계에서 내가 여기에 제안한 것과 같은 것을 제안하는 것이 최선의 경우에 당신을 방에서 비웃는 것입니다.

내가 상상할 수있는 가장 미친 접근 방법은 두 가지 다른 스키마를 사용하는 것입니다. 스키마 1은 테이블을 소유합니다. 스키마 2는 코드를 소유합니다. 설치시, 스키마 2가 참조해야하는 모든 오브젝트에 대한 동의어를 작성하십시오. 코드가 설치 될 때 원격 데이터베이스를 사용할 수 있으면 원격 데이터베이스의 개체를 참조하는 동의어를 작성하십시오. 그렇지 않으면, 로컬 데이터베이스의 오브젝트를 참조하는 동의어를 작성하십시오. 이를 통해 동적 SQL을 사용하지 않고도 코드와 테이블간에 간접적 인 계층을 생성하여 단일 객체 세트를 생성 할 수 있습니다.

관련 문제