2011-04-20 3 views
2

우리는 여러 환경 (개발, 테스트, 생산 등)을 가지고 있습니다. Oracle 10g 사용. 모든 값은 web.config에서 읽습니다.하드 코딩하지 않고 다른 스키마를 참조하는 방법

두 개 이상의 데이터베이스 스키마를 사용하고 있습니다. 하나는 응용 프로그램 용이고 다른 하나는 타사 응용 프로그램 용입니다. 참조 용으로 각각 MYAPP 및 THEIRAPP이라고합니다.

이름으로 THEIRAPP를 참조하는 SQL 문이 C# 코드에 있습니다. 예 : string sql = @ "select * from THEIRAPP.address where zip = {0}";

모든 환경에서 동일한 이름 지정 규칙이 있지만 테스트 환경에서 데이터베이스 관리자가 다른 이름 (예 : THEIRAPP2)을 사용 했으므로 THIRAPP.address에 대한 호출이 작동하지 않아 제대로 작동하지 않습니다 그 환경에 존재하지 않습니다.

최소한의 변경으로 C# 코드에서 이러한 쿼리를 어떻게 변경합니까? 나는 SQL 호출이 스토어드 프로 시저에 있어야한다는 것을 알고 있지만, 코드를 작성하지 않았으며 이러한 종류의 변경 사항을 적용 할 수있는 가설을 갖고 있지 않다 (적어도 현재는 그렇지 않다).

도움이나 제안을 주시면 감사하겠습니다. 귀하의 도움에 미리 감사드립니다.

답변

4

가장 간단한 대답은 스키마 이름이 항상 다른 환경에서 일치하는지 확인하는 것입니다.

이것이 가능하지 않으면 테이블 이름간에 충돌이 있습니까? 즉, My_App.Address 테이블과 Their_App.Address 테이블이 있습니까? 충돌이없는 경우, 당신은 단순히

CREATE SYNONYM address FOR my_app.address 
CREATE SYNONYM person FOR their_app.person 

충돌이있는 경우, 당신은 여전히 ​​동의어를 사용할 수 있습니다, 당신은 단지, 즉 객체의 이름을 변경해야 할 것 여러 테이블을 가리 동의어를 생성하고 스키마 이름을 제거 할 수

CREATE SYNONYM my_address FOR my_app.address 
CREATE SYNONYM their_address FOR my_app.address 

각 쿼리를 실행하기 전에 현재 스키마를 변경하지 않아도 될 수 있습니다.당신이

ALTER SESSION SET current_schema = MY_APP 
SELECT * FROM address 

을 할 경우 자동으로 my_app.address 테이블에서 선택합니다. 당신이

ALTER SESSION SET current_schema = THEIR_APP 
SELECT * FROM address 

을 할 경우 자동으로 상황보고 후 their_app.address 테이블에서

+0

+1 누군 데 초기 생각을 선택할 것 두 가지 서로 다른 스크립트 ..하는 것입니다 품질 보증을위한 데브 하나 하나를 가지고 있었다 그들이 빌드를 할 때마다 동의어를 만듭니다. 세션 변경 아이디어 (OP가 가능한 경우)는 좋은 선택입니다. –

+0

이것이 마침내 어떻게 작동하는지입니다. – Orin

1

스키마 파일을 저장하기 위해 구성 파일을 사용할 수 있습니까? 가장 간단한 해결책 인 것 같습니다.

0

좋아요, 일부는 환경과 관련이 있습니다 (즉, 테스트 환경과 생산 환경이 얼마나 잘 구분되어 있습니까?)하지만 코드를 통해 절대적으로해야한다고 가정하면 설정 파일을 사용하십시오.

Sql 문의 구성 섹션을 추가하고 ("SqlStatements"라고합니다) 각 (현재) 하드 코딩 된 문에 대한 항목을 추가하십시오.

이제 코드에서 : SqlCommand cmd = new SqlCommand("yourTextHere") 대신 정확한 sql 문을 구성 파일에서 호출 한 다음 sql을 실행하십시오.

그런 다음 테스트 환경과 프로덕션 환경에 대해 서로 다른 구성 파일을 설정합니다. 또한 실제로 코드를 수정하지 않고도 나중에 SQL 문을 변경할 수 있습니다.

하지만 당신이 말한 것처럼 더 나은 대답은 (상사가 동의 할 수 있다면) 코드를 Stored Procedures로 옮기고 그 코드를 호출하는 것입니다.

관련 문제