MSSQl 와 MYSQL에서 테이블 불러와서 조인한 임시테이블 터미널 프로그램 만들기

안녕하세요! C# 독학중인 초급개발자입니다.

지금 프로젝트를 진행하다가 특이사항으로 저의 DB(Mysql)과 타 DB(Mssql, sql server 2007)의 테이블을 조인해서 사용할 일이 발생했습니다.

DB가 달라 지금까지 데이터를 불러와서 DataTable끼리 링큐로 조인해서 사용하는데 링큐에 대한 지식도 짧고 하고싶은대로 쿼리를 바꿔 사용하기 어렵더라구요…

그래서 이러던 와중 터미널 프로그램을 만들어서 각 디비에서 데이터를 불러와 하나의 임시테이블을 만들어주고 Data의 수정사항을 주기적으로 확인해서 임시테이블에 업데이트를 해주는 방식을 할 수 있다고 들었습니다.

위 설명한 부분을 직접 확인할 예제나 참고할 문서가 있다면 고수님들께서 추천해주시기 바랍니다…
또 만약 다른 방법도 있으면 얼마든지 제시해주시면 더욱 고맙겠습니다!

감사합니다.

<추가내용>
일단 두 테이블을 가져와야 하는 상황과 이유를 설명하겠습니다.

우선 기존 사용하는 타 업체 프로그램이 있습니다. (MsSql, sql server 2007) 여기서 DB의 접근권한은 열어주지 않고 스토어 프로시져 형태로 데이터를 저에게 제공합니다. 그렇기 때문에 개발이 이어지면서 추가적으로 입력해야하는 정보가 필요해졌습니다. 타업체 DB에 컬럼을 추가할 수 없으니, 제가 사용하는 DB(Mysql)에 추가정보를 입력하기 위해서 타업체 DB의 기본키를 같이 저장한 별도 테이블을 만들어
따로 관리하고 있습니다. 그렇게 해서 지금은 타업체 DB 데이터를 불러오고 제DB의 별도 테이블을 C#에서 링큐로 조인해서 사용하고 있습니다.

  1. 타업체 DB의 프로시져 데이터 불러옴
  2. 추가로 필요한 데이터는 입력화면을 개발해 내DB에 저장함
  3. 타업체 DB의 데이터와 내DB의 별도데이터를 각각 DataTable로 불러와 링큐로 하나의 DataTable로 만들어 사용하는중
    4.링큐 자체에 대한 지식이 짧고 불편해서 실시간 수정사항이 반영해서 두 DB의 테이블을 하나의 테이블로 만들어 내DB에 임시테이블을 만들어 사용하고싶습니다!
2개의 좋아요

안녕하세요! 저도 주니어 개발자입니다. 상황설명이 좀 더 있으면 더 좋은 판단이 될 것 같습니다!

상황을 조금 더 구체적으로 알려주실 수 있으실까요?

예를 들어서 다른 디비에서 가져와야하는 이유라던지, 프로그램에서 조인하는이유 요런것들이 궁금합니다!

1개의 좋아요

추가내용 입력했습니다!

2개의 좋아요

여기까지 확인했을때는 고객이 추가, 업데이트, 삭제할 내용은 cookie 님이 사용하는 테이블에 있고 거기에 따른 부가적인 정보는 타 업체에서 제공하는 프로시저를 통해 처리 해야 하는 상황 같다고 느껴지네요.

ㅎㅎ 맞는지는 모르겠습니다.

1개의 좋아요

네 맞습니다~

1개의 좋아요

제 생각에는 타 업체 DB 에서 데이터가 주기적으로 업데이트 되는 상황이니 임시 테이블에 업데이트를 하고 계신 거 같고 이 상황에서는 데이터의 불일치를 만드는 주기적 업데이트는 쓰지 않는 것이 좋을 것 같습니다!

cookie 님이 사용하는 테이블을 기준으로 사용자는 페이징 해서 보고 있을 테니 타 업체 프로그램에서 필요한 범위만큼 불러오고 데이터를 for 문으로 가공하는 것이 좀 더 합리적인 선택으로 보이는데…

그렇게 하지 않으신 이유가 있으실 거라고 봅니다 ㅎㅎ;;

1개의 좋아요

MSSQL에는 메시지 큐으로 알림을 받는 기능이 있습니다. 이를 이용하면, Insert, Update, Delete 시에 알림을 받을 수 있습니다.

이를 설정하려면, 꽤 복잡한데, 이를 간편하게 사용할 수 있도록 하는 누겟 패키지가 있습니다.
christiandelbianco/monitor-table-change-with-sqltabledependency: Get SQL Server notification on record table change (github.com)

아래는 이 기능을 사용하는 강좌입니다.
(마침 저도 최근에 봐서 기억이 났습니다.)

문제는, 이 기능을 사용하려면, MSSQL 접근 계정에 몇 가지 권한이 부여되어야 하는데,

고객사가 저장 프로시저만 줬다면, 데이터 보안에 민감하다는 소리인데… 과연 권한을 줄지 안 줄지는 모르겠네요.

위 솔루션을 사용할 수 있기만 하다면, 두 데이터 베이스의 동기화가 매우 효율적으로 이뤄질 것 같기는 합니다.

현재로서는, 달리 대안이 없기 때문에, 특별히 문제있어 보이지는 않습니다.

보통 링큐가 더 쉽고 안전(type-safe, 컴파일러 개입)하지 않나요?

3개의 좋아요

타 DB는 DB 링크 서비스가 있지만, 아마 MySql은 없으므로, 사실 상 타 DB와 조인은 불가능합니다.
그래서 아마 지금 1번 DB , 2번 DB 의 데이터를 불러와 메모리상에서 조인을 하시는 것 같습니다.
즉 두 DB 간 트랜잭션은 없다는 거, 만약 두 DB간의 정확한 동기화가 필요하시다면,
고객사쪽과 협의를 하셔서 풀어야 할 것 같습니다. 아니면 초당 폴링을 이용하여, 고객사 DB쪽에 최대한 최신 데이터를 불러와 동일한 방식으로 푸셔도 됩니다.
기존 방식의 DB 연결 및 로직 처리 시 트랜잭션 격리수준을 설정하여, 처리하시면 데이터부분은 동기화가 가능 할 것 같습니다. 단 고객사 DB LOCK 발생 시 미움을…트랜잭션 타임아웃이 설정 되어 있겠죠?

1개의 좋아요