다음을 통해 공유


Microsoft SQL Server를 사용하여 복제할 때 Oracle 게시 트리거가 게시되지 않은 열에 대한 데이터 보내기

이 문서는 Oracle 게시자 및 열 필터링에서 트랜잭션 복제를 사용할 때 발생하는 문제를 해결하는 데 도움이 됩니다.

원래 제품 버전: SQL Server
원래 KB 번호: 2310152

증상

Oracle 게시자 및 열 필터링과 함께 트랜잭션 복제를 사용하는 경우 게시 마법사(행 수준 트리거)에서 생성된 트리거가 몇 개의 열만 게시되더라도 테이블의 모든 열을 추적하고 있음을 알 수 있습니다.

원인

게이트웨이 옵션으로 구성된 Oracle 게시자를 사용하여 만든 게시에 세로 필터를 적용하면 SQL Server는 추적 테이블이 관심 있는 열만 포함하도록 제한하지만 트리거 이벤트를 제한하지는 않습니다. 따라서 추적 테이블에 포함되지 않은 테이블 열에 대한 업데이트가 많으면 불필요한 많은 행이 추적 테이블에 기록됩니다.

해결 방법

복제 설정 중에 Oracle 데이터베이스에서 생성된 데이터베이스 트리거를 수동으로 변경하여 업데이트 시 트리거가 실행되는 열을 제한하는 명시적 열 목록을 포함시켜 문제를 해결할 수 있습니다.

다음 절차를 사용하여 해결 방법을 구현합니다.

  1. Oracle 게시자가 게이트웨이 게시자로 구성되었는지 확인
  2. 게시된 테이블 또는 연결된 테이블스페이스를 읽기 전용으로 표시합니다.
  3. 게시된 테이블과 연결된 행 트리거 및 로그 테이블의 이름을 확인합니다.
  4. 게시된 열만 포함하는 명시적 열 목록을 포함하도록 발생 조건을 식별하는 행 트리거의 절을 수정합니다.
  5. 게시된 테이블 또는 연결된 테이블스페이스를 복원하여 쓰기를 읽습니다.

각 단계에 대한 자세한 내용은 다음 단락을 참조하세요.

게시된 테이블 또는 연결된 테이블스페이스를 읽기 전용으로 표시하는 방법:

트리거를 수정하기 전에 변경 내용이 손실되지 않도록 테이블을 읽기 전용으로 설정해야 합니다. Oracle 버전이 11g 이전인 경우 테이블과 연결된 테이블스페이스를 읽기 전용으로 표시해야 합니다. 테이블스페이스를 읽기 전용으로 만들면 테이블스페이스의 데이터 파일에 대한 쓰기 작업을 방지할 수 있습니다. 게시된 테이블과 연결된 테이블스페이스를 확인하려면 다음 쿼리를 실행합니다.

select table_name, tablespace_name from all_tables

where table_name = 'my_table' and owner = 'my_name';

데이터 파일을 읽기 전용으로 만들려면 다음과 유사한 명령을 사용합니다.

ALTER TABLESPACE my_tablespace READ ONLY;

Oracle 11g에서는 테이블을 읽기 전용으로 직접 표시할 수 있습니다.

ALTER TABLE my_table READ ONLY;

게시된 테이블 또는 연결된 테이블스페이스를 읽기 전용으로 표시하는 방법:

트리거를 수정하기 전에 변경 내용이 손실되지 않도록 테이블을 읽기 전용으로 설정해야 합니다. Oracle 버전이 11g 이전인 경우 테이블과 연결된 테이블스페이스를 읽기 전용으로 표시해야 합니다. 테이블스페이스를 읽기 전용으로 만들면 테이블스페이스의 데이터 파일에 대한 쓰기 작업을 방지할 수 있습니다. 게시된 테이블과 연결된 테이블스페이스를 확인하려면 다음 쿼리를 실행합니다.

select table_name, tablespace_name from all_tables

where table_name = 'my_table' and owner = 'my_name';

데이터 파일을 읽기 전용으로 만들려면 다음과 유사한 명령을 사용합니다.

ALTER TABLESPACE my_tablespace READ ONLY;

Oracle 11g에서는 테이블을 읽기 전용으로 직접 표시할 수 있습니다.

ALTER TABLE my_table READ ONLY;

게시된 테이블과 연결된 행 트리거 및 로그 테이블의 이름을 확인하는 방법:

모든 로그 테이블 및 트리거에는 다음 템플릿에서 생성된 이름이 있습니다.

  • HREPL_ARTICLE N LOG_ V

  • HREPL_ARTICLE N_TRIGGER_ROW

여기서 N과 V는 다음과 같은 방식으로 결정됩니다.

N은 게시된 테이블과 연결된 article_id, 배포자에서 다음 SQL 쿼리를 사용하여 가져올 수 있습니다.

select name, table_id from distribution.dbo.IHarticles

V는 버전 지정자입니다. 두 로그 테이블이 N에 대해 동일한 연결된 값을 갖는 경우 활성 로그의 V 값이 더 큽니다.

게시된 열만 포함하는 명시적 열 목록을 포함하도록 발생 조건을 식별하는 행 트리거의 절을 수정하는 방법:

Oracle은 생성된 트리거를 수정하는 데 적합한 SQL Developer라는 무료 GUI 도구를 제공합니다. SQL 개발자 도구에서 다음 단계를 사용하여 필요한 수정을 수행할 수 있습니다.

  1. Oracle 인스턴스에 대한 연결을 엽니다.

  2. 정의된 Oracle 스키마 아래에서 복제 관리자 사용자에 해당하는 스키마를 확장합니다.

  3. 개체 목록에서 트리거를 찾아서 확장하여 복제 관리자 사용자가 소유한 트리거 목록을 확인합니다.

  4. 수정할 트리거를 찾아 강조 표시합니다. 트리거의 텍스트가 오른쪽 창에 표시됩니다.

  5. 목록에서 트리거 이름을 마우스 오른쪽 단추로 클릭하고 편집을 선택합니다.

  6. 트리거 정의에 대한 변경은 트리거의 시작 부분에 가깝게 수행되며 다음과 유사하게 표시됩니다.

    • .. CREATE OR REPLACE TRIGGER AFTER DELETE OR INSERT OR UPDATE OF

    • my_name.my_table

    • 각 행에 대해...

  7. 트리거를 수정하려면 UPDATE 키워드 뒤 문서에 포함된 게시된 테이블의 열 목록을 포함합니다. repl 관리자 스키마 아래에서 테이블을 확장한 다음 게시된 테이블과 연결된 아티클 로그 테이블을 확장하면 포함할 열은 HREPL_ 앞에 추가된 5개의 초기 메타 데이터 열 다음에 로그에 나타나는 열입니다. 열 목록의 시작 부분에 ON이라는 단어가 표시됩니다. 게시된 열 PK, c1 및 c2가 있는 테이블 my_name.my_table 에 필요한 수정 사항은 다음과 같습니다.

    create or replace TRIGGER AFTER DELETE OR INSERT OR UPDATE ON "PK", "c1", "c2" OF my_name.my_table FOR EACH ROW...
    
  8. 수정을 완료하면 트리거 이름을 마우스 오른쪽 단추로 클릭하고 컴파일을 선택하여 수정된 트리거를 컴파일합니다. 결과 트리거가 컴파일 후 유효한 것으로 식별되는지 확인합니다.

게시된 테이블 또는 연결된 테이블스페이스를 복원하여 쓰기를 읽는 방법:

트리거 수정을 완료한 후 읽기 전용으로 표시된 테이블에 따라 테이블스페이스 또는 테이블을 READ WRITE로 복원해야 합니다. 다음 문은 my_tablespace 테이블스페이스를 쓰기 가능하게 만듭니다.

ALTER TABLESPACE *my_tablespace* READ WRITE;

Oracle 11 g에서 테이블 변경 명령을 사용하여 테이블을 복원하여 수정을 허용합니다.

ALTER TABLE *my_table*  READ WRITE;

Oracle 11 g에서 다음 쿼리를 사용하여 게시된 테이블이 더 이상 읽기 전용이 아니라는 것을 확인합니다.

select table_name, read_only

from dba_tables

where table_name = 'my_table' and owner = 'my_owner'

타사 고지 사항

타사 정보 고지 사항

이 문서에 나와 있는 다른 공급업체 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.