이벤트 처리기의 Propagate 시스템 변수 속성
한대성
MS SQL Server MVP
에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자
SSIS 패키지에서 이벤트 처리기는 아주 유용한 기능 중 하나입니다. 에러 처리를 할 때나 커스텀 로깅을 구현할 때 자주 이용이 되며, 이를 잘 활용하면 에러가 나도 끄떡없는(??) 견고한 패키지를 만들 수 있습니다.
본 글에서는 이벤트 처리기에 있는 Propagate라는 시스템 변수의 영향에 대해 살펴보겠습니다.
본 주제는 Jamie Thomson이 블로그에 올려놓은 주제이긴 한데, 몇 번을 봐도 정확히 와 닿질 않아서 제 나름대로 환경을 만들어 설명드리겠습니다.
참고로 Jamie Thomson의 글은 다음 링크를 참고하세요.
우선, 다음과 같이 제어 흐름의 속성 중 Description에다가 Main Package라고 적습니다.
그리고 스크립트 작업을 하나 갖다 놓고선, 이 작업의 이름을 Main Script라고 하고, Description을 Main Script라고 적습니다.
이제 제어 흐름 영역을 선택한 상태에서 상단의 이벤트 처리기 탭을 클릭한 후, OnPreExecute 이벤트를 활성화(단순히 클릭) 하고선 아래와 같이 스크립트 작업을 하나 추가합니다. 이 작업의 이름과 Description을 PackageOnPreExecuteScript 이라고 변경합니다.
스크립트 작업 편집기를 연 다음, ReadOnly 변수에 SourceDescription 이라고 입력하고, 다음과 같은 소스를 입력합니다.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Public Class ScriptMain
Public Sub Main()
MsgBox("Package Level onPreexecute | Source : " + Dts.Variables("SourceDescription").Value.ToString)
Dts.TaskResult = Dts.Results.Success
End Sub
End Class
이제 스크립트 작업(Main Script)에 대한 onPreExecute 이벤트를 추가합니다. 이 작업의 이름과 Description도 위에서와 같이 ScriptTaskOnPreExecuteScript 으로 변경해 줍니다.
그런 다음, 이 스크립트 작업의 편집기에서도 ReadOnly 속성에 SourceDescription을 넣어주고, 다음과 같은 스크립트를 입력합니다.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Public Class ScriptMain
Public Sub Main()
MsgBox("Task Level onPreexecute | Source : " + Dts.Variables("SourceDescription").Value.ToString)
Dts.TaskResult = Dts.Results.Success
End Sub
End Class
자, 이제부터 테스트 할 것은 이벤트 처리기에 있는 시스템 변수 중 Propagate라는 속성 값에 따라 어떻게 달라지는지를 살펴보겠습니다. 시스템 변수는 모두 ReadOnly 성격으로써 사용자가 설정할 수 있는 변수는 아닙니다. 하지만, 이 변수만 유일하게 값을 설정할 수 있습니다. 시스템 변수는 변수 창에서 아래와 같이 회색 버튼을 누르면 나타납니다.
현재 구성된 구조는 다음과 같습니다.
각 이벤트 처리기의 Propagate 속성값을 True/False 로 바꿔가면서 테스트 하면 다음과 같은 순서로 메시지가 출력되는 것을 확인할 수 있습니다.
패키지 수준 |
false |
true |
false |
true |
태스크 수준 |
false |
false |
true |
true |
1 |
Package Level onPreexecute | Source : Main Package |
Package Level onPreexecute | Source : Main Package |
Package Level onPreexecute | Source : Main Package |
Package Level onPreexecute | Source : Main Package |
2 |
Package Level onPreexecute | Source : ScriptTaskOnPreExecuteScript |
Package Level onPreexecute | Source : ScriptTaskOnPreExecuteScript |
Package Level onPreexecute | Source : ScriptTaskOnPreExecuteScript |
Package Level onPreexecute | Source : ScriptTaskOnPreExecuteScript |
3 |
Task Level onPreexecute | Source : Main Script |
Task Level onPreexecute | Source : Main Script |
Task Level onPreexecute | Source : Main Script |
Task Level onPreexecute | Source : Main Script |
4 |
- |
- |
Package Level onPreexecute | Source : Main Script |
Package Level onPreexecute | Source : Main Script |
즉, 이벤트 처리기의 Propagate 시스템 변수를 True로 설정하면 현재 발생된 이벤트가 상위 컨테이너(여기서는 패키지)의 이벤트로 한 번 더 전파(Propagage)되는 것을 볼 수 있습니다.
조금 난해하기에 부가 설명을 드리겠습니다.
첫 번째 경우인 패키지의 이벤트 처리기에서 Propagate가 false이고 태스크의 이벤트 처리기에서 Propage가 false인 경우,
패키지가 시작되면 가장 먼저 패키지가 OnPreExecute 이벤트를 타게 됩니다. (Package Level onPreexecute | Source : Main Package)
그런 다음, 스크립트 작업이 시작되려고 보니깐, 스크립트 작업의 OnPreExecute에 작업 태스크(ScriptTaskOnPreExecuteScript)가 있어서 요 놈도 시작되면서 상위 컨테이너인 패키지의 OnPreExecute 이벤트를 호출하게 됩니다. 뜻밖이지요? (Package Level onPreexecute | Source : ScriptTaskOnPreExecuteScript)
이 후, Main Script에 대한 OnPreExecute 이벤트 처리기가 실행됩니다. (Task Level onPreexecute | Source : Main Script)
그런데, Main Script에 대한 OnPreExecute 이벤트 처리기의 Propagate 속성이 true인 경우는 한 단계가 더 수행됩니다. 이 속성을 나름대로 해석하자면, 이 이벤트 처리기에서 이벤트가 발생할 경우, 상위 컨테이너의 이벤트 처리기도 한 번 더 호출하라는 것이지요.
그래서 위에서 노란색으로 표시한 부분과 같은 메시지가 한 번 더 발생이 되는 것입니다. (Package Level onPreexecute | Source : Main Script)
그럼..^^
'연구개발 > DTS & SSIS' 카테고리의 다른 글
DB 데이터를 엑셀 시트에 분할하여 내보내기 (1) (0) | 2009.06.20 |
---|---|
엑셀 파일의 시트 명 알아내기 (0) | 2009.06.20 |
OLE DB 원본으로 뷰(View)를 사용할 때 주의할 점 (0) | 2009.06.20 |
RetainSameConnection 옵션 (0) | 2009.06.20 |
Object 형 변수를 이용한 루핑 작업 구현 (0) | 2009.06.20 |