Q&A

  • Stored Procedure 실행 오류 문제 입니다
1.운영환경

1) DB : MSSql Server
2) Tool : Delphi 6.0
3) A 서버(MSSql 2005)와 B 서버(MSSql 2000)

2.문제점

  1) A 서버가 B 서버를 Linked Server 로 잡았고요
  2) 프로그램에서는 다음의 두가지 쿼리문장를 하나로 묶어서 실행 합니다
     - A 서버의 테이블에 INSERT.
     - B 서버의 Stored Procedure(INSERT 문) 를 호출합니다.
     - 위 두가지 쿼리문장을 하나의 문장으로 묶어 실행하는 방식
       방식 :
             AdoQuery.Sql.Text := '위의 두 문장 실행명령어 나열함'
             AdoQuery.ExecSQL;
  3) 델파이로 작성된 프로그램에서 실행을 하게 되면 아무런 오류도 발생되지 않으나 데이타가 저장되지 않습니다.
  4) 위에서 나열한 쿼리 문장을 쿼리분석기에서 실행을 하면 데이타가 저장 됩니다.
  
3. 결론
    1) 같은 쿼리문을 실행하였는데 결과가 다른 이유가 무엇인지요.
    2) Stored Procedure 및 저장 대상 테이블의 사용(접근)권한을 확인해 보아도, 도통 모르겠군요
    
    
귀하신 답변 부탁 드립니다.
    
3  COMMENTS
  • Profile
    마이크로김 2007.07.27 19:24

    조심스럽게 commit 문 빠진거 아닌가요.

  • Profile
    희아빠 2007.07.28 00:05
    관심에 감사 드립니다.
    commit문은 있고요...


    다음은 보충설명 입니다
    //========================================================

        try
            if Conn_chk then begin
                Query := TADOQuery.Create(nil);
                Query.Connection := dmcommon.ADOConn;
                Query.CommandTimeout := 0;
                Conn_tran('BEGIN');
                Query.Close;
                Query.SQL.Clear;
                Query.SQL.Text := sqltxt; <================ sqltxt 는 전달받은 쿼리문 입니다
                Query.ExecSQL;
                Conn_tran('COMMIT');
                Query.Free;
                result := true;
            end
            else
                result := false;
        except
            on e : exception do begin
                Conn_tran('ROLLBACK');
                result := false;
                showmessage(e.Message);
            end;
        end;


    위와 같습니다.


    sqltxt 에는 다음과 같은 문장으로 구성되었습니다.

          INSERT INTO TABLE_A values (....대충 적음...)
          Execute [123.456.78.900].Tablespace.Dbo.Stroedprocedure_name '1', 'AAA', '100' ......



    아렇게 두게 이상의 문장을 모아 모아 한방에 보냅니다.

    첫번째 문장은 A서버 컴퓨터의 Tablespace AAA 에 있는 테이블에 저장 하며
    두번째 문장은 B서버 컴퓨터의 Tablespace BBB 에 있는 테이블에 저장 합니다.

    A에서 B를 Linked Server(모두 MSSQL Server)로 연결하였으므로 "[123.456.78.900].Tablespace.Dbo." 형식을 붙여서 사용합니다.


    //========================================================



    추가 질문  !!!

    Commit이 두 문장 모두에 적용이 될까요? (않되는것으로 생각이 되지만 되는 것 처럼 보이는데 ...)







  • Profile
    마이크로김 2007.07.30 19:23


    sql문을 2번 처리 하시지 마시고
      처음 write 되는  a 서버 procedure 안에서 b 서버 링크 걸어서 write 하면 될것같으데요....
       그럼 Procedure 에서 처리 하기 때문에 정확한 data 처리 될것 같은데요.