2008-10-18 3 views
2

두 개의 데이터베이스가 있습니다. 데이터베이스 A에는 id, group 및 flag 열이있는 테이블 A가 있습니다. 데이터베이스 B에는 ID 및 플래그 열이있는 테이블 B가 있습니다. 표 B는 기본적으로 표 A where the group == 'B'의 하위 집합입니다.SQL Server의 두 테이블에 걸쳐 열 조정

그들은 현재이 시점에서 이해할 수없는 이상한 방식으로 업데이트되고 생성되며이 질문의 범위를 벗어납니다 (이 설정은이 클라이언트의 기본 설정 및 방법을 수정하지는 못합니다).

표 A의 플래그가 업데이트되면 테이블 B에는 반영되지 않지만 반드시 있어야한다는 점이 문제입니다. 이것은 시간이 중요한 문제가 아니기 때문에이를 처리 할 작업을 제안하는 것이 좋습니다. 어쩌면 주말이 끝났거나 어쩌면 내가 가장 기본적인 저장 프로 시저 (필자는 DBA가 아닌 프로그래머)를 작성한 적이 없기 때문에 아마도이 문제를 해결할 방법을 모르겠습니다. 단순한 수준에서

는 저장 프로 시저는 다음
Select * in table A where group == B 

의 라인을 따라 뭔가의 resultset을 반복 할 것이며, 각 ID에 대한 플래그를 업데이트합니다.

하지만 이걸 stored procedure처럼 반복하는 방법조차 잘 모르겠습니다. 제안? 예제 코드가 선호됩니다.

합병증 : 좋아, 이것 역시 약간 어려워진다. 모든 그룹에 대해 표 B는 별도의 데이터베이스에 있으므로 모든 그룹에 대해이 플래그를 업데이트해야합니다. 따라서 각 DB 이름을 처리하기 위해 각 그룹마다 별도의 트리거를 설정해야합니다.

예, 표 B에 대한 삽입이 이미 처리되었습니다. 이는 플래그 상태를 업데이트하기위한 것입니다.

+0

http://stackoverflow.com/questions/149132/how-can-one-iterate-over-stored-procedure-results-from-within-another-stored-pr에서 비슷한 질문이있는 것으로 보입니다. 그것은 내가 성취하고자하는 바를 한 발짝 내딛지 않습니다. –

+0

방금 ​​링크 된 질문을 다시 읽었습니다. 당신의 상황에 대해 누락 된 다음 단계를 어떻게 기술하겠습니까? 연결된 질문에 허용되지 않은 커서를 사용하는 방법을 묻고 있습니까? 이 문제의 척도는 무엇입니까? 즉 표 A의 행 수는 얼마입니까? – Matt

+0

현재 2 백만입니다. 나는 그것이 추가 된 행의 연간 금액이기를 기대합니다. –

답변

0

A가 수정 될 때 필요한 변경을 B에 푸시하는 테이블 A의 업데이트 트리거를 작성하십시오.

기본적으로 (구문이 올바르지 않을 수 있음, 지금은 확인할 수 없음). 삽입 된 테이블에 업데이트의 모든 업데이트 된 행이 포함되어 있다는 것을 상기하는 것처럼 보이지만이를 확인하기 위해 확인해야 할 수도 있습니다. 그래도 방아쇠가가는 길이라고 생각합니다.

create trigger update_b_trigger 
on Table_A 
for update 
as 
begin 
    update Table_B 
    set Table_B.flag = inserted.flag 
    from inserted 
      inner join Table_B 
      on inserted.id = Table_B.id 
       and inserted.group = 'B' 
       and inserted.flag <> Table_B.flag 
end 

[편집] 내가 인서트/이미 처리 표 B에 삭제하고 해결해야 할 표 B 단지 플래그 업데이트 있다고 믿고있어.

+0

좋아, 그건 새로운 업데이 트를 위해 작동하는 것,하지만 데이터베이스가 지금 동기화되지 않습니다. 또한 20-30 개의 트리거 (각 그룹/DB에 하나씩)가 생성되어 성능 문제가 발생합니까? –

2

ID가 고유 키이고 연결된 서버 또는 일부 서버를 통해 쿼리를 실행한다고 가정하면이 SQL 문이 작동합니다 (동일한 서버의 두 테이블에서 작동 함).

UPDATE Table_B 
SET Table_B.Flag = Table_A.Flag 
FROM Table_A inner join Table_B on Table_A.id = Table_B.id 

당신이 연결된 서버를 사용할 수없는 경우

(Table_B 이미 그룹 = B, 우리는 우리의 쿼리에이 조건을 포함 할 필요가 없습니다 Table_A에서 행의 하위 집합을 포함하고 있기 때문에), 다음 나는 일종의 SSIS 패키지로 그것을하려고 시도 할지도 모른다. 또는 linked question (comments, above)에 설명 된 방법을 사용하여 데이터베이스 A의 관련 데이터를 데이터베이스 B의 임시 테이블 등으로 가져온 다음 임시 테이블을 사용하여이 쿼리를 실행합니다.

2
UPDATE 
    DatabaseB.dbo.Table_B 
SET 
    DatabaseB.dbo.Table_B.[Flag] = DatabaseA.dbo.Table_A.Flag 
FROM 
    DatabaseA.dbo.Table_A inner join DatabaseB.dbo.Table_B B 
    on DatabaseA.dbo.id = DatabaseB.dbo.B.id 

합병증 : sevaral 그룹의 경우 그룹 당 하나 개의 업데이트 SQL을 실행합니다.

참고 []없이 플래그를 사용할 수 있습니다. stackoverflow 구문 색칠 때문에 괄호를 사용하고 있습니다.

관련 문제