2014-02-21 2 views
0

6.5에서 스키마를 스크립팅하고이 스크립트의 구문 문제를 수정 한 다음이 스크립트를 사용하여 2012 데이터베이스를 만드는 방법으로 SQL Server 6.5 데이터베이스를 SQL Server 2012로 업그레이드했습니다.SQL Server 중첩 트리거가 예상대로 실행되지 않습니다.

동시에 프런트 엔드 응용 프로그램을 PowerBuilder 6에서 12.5로 업그레이드했습니다.

응용 프로그램에서 특정 작업을 수행하면 주어진 테이블에 데이터가 삽입됩니다. 이 테이블에는 INSERT 조!와 연관된 트리거가 있으며이 트리거 내에서 다른 테이블이 갱신됩니다. 이로 인해이 테이블에서도 추가 트리거가 실행됩니다.

처음에 파워 빌더 응용 프로그램은 다음과 같은 오류를보고합니다

행이 검색 및 업데이트 사이에 변경되었습니다.

데이터베이스를 변경하지 않았습니다.

이제이 오류 메시지의 의미를 이해하지만 이것이 실제로 '흥미로운 부분'입니다.

트리거에서 무슨 일이 일어나고 있는지 알기 위해 이벤트 흐름을 더 잘 이해할 수 있도록 트리거 내에서 로깅 테이블에 데이터를 삽입하기로 결정했습니다. 이것은 다소 의외의 부작용을 가져 왔습니다. PowerBuilder 애플리케이션은 더 이상 오류를보고하지 않으며 데이터베이스를 체크인 할 때 모든 데이터가 예상대로 작성됩니다.

이러한 로깅 행을 제거하면 이전에 나열된 오류 메시지와 함께 응용 프로그램이 다시 실패합니다.

제 질문은 - 누군가가 왜 로깅의 일부 라인을 추가 할 때이 부작용이있을 수 있다고 설명 할 수 있습니까? 거의 로깅 테이블에 데이터를 쓰거나 로깅 속도를 늦추거나 어떻게 든 올바른 순서로 실행되도록 트리거를 직렬화하는 일부 로깅을 추가하는 것처럼 보입니다 ...

미리 알려 주셔서 감사합니다. :-)

답변

0

글쎄, 왜이 메시지가 올지를 요약하자. (나는 더 이상 설명이 http://www.techno-kitten.com/PowerBuilder_Help/Troubleshooting/Database_Irregularities/database_irregularities.html이다.) 이것은 기본적으로 데이터베이스가 DataWindow에 의해 생성 된 WHERE 절을 기반으로 UPDATE 할 데이터를 더 이상 찾을 수 없기 때문입니다. 트리거는 업데이트 된 테이블의 열에서 데이터를 변경함으로써이 문제를 일으키므로 WHERE =의 논리가 실패합니다. (데이터를 응용 프로그램에서 데이터를 검색

  • 을, 또한 DBMS 도구에서 모두에서 데이터를 캐시 :이 문제를 해결한다면

    , 나는 트리거의 두 버전에 대해 다음을 할 거라고 PB의 원래 버퍼에서 PB의 디버거 중단 점이 도움이 될 수 있음) WHERE 절에있을 것으로 예상되는 열을 비교하십시오 (데이터와 상태 플래그의 클라이언트 측 조작으로 인해이 문제가 발생할 수도 있음)

  • 데이터를 변경하고 시작하십시오. SQLPreview 이벤트의 중단 점에서 저장
  • (트리거 발생시 여러 행이 가능합니다. 여전히 SQLPreview에 일시 정지하면서,이 모든 통해

어딘가에 DBMS 도구를 사용하여 데이터를 선택하려면 UPDATE 문에서 WHERE 절을 사용

  • ), 보류중인 UPDATE 문을 캐시, 당신은 어디에서 확인할 수 있습니다 과정 실패의 경우를 무너 뜨 렸고, 그것이 왜 좋은 경우에 통과 하는지를 알아 낸다.나는 당신이 가설을 세우는 것보다 훨씬 더 간단한 해결책을 찾을 거라고 생각합니다.

    행운을 빌어 요, 팁 테리에 대한

  • +0

    많은 감사

    테리. – user3336885

    +0

    팁 테리에 대해 감사드립니다. PowerBuilder 12.5가 반환 된 Row Count를 처리하는 방법과 관련된 문제가 나타납니다. INSERT와 관련된 일련의 계단식 트리거가 있으므로 많은 다른 행 수가 반환됩니다. 이들은 PB 6.5에서는 걸러졌지만 12.5에서는 걸러지지 않았습니다. RecheckRows DBParm을 설정하면이 문제가 해결됩니다. – user3336885