다음을 통해 공유


데이터 흐름 구성 요소 유효성 검사

적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime

Validate 올바르게 구성되지 않은 구성 요소의 PipelineComponent 실행을 방지하기 위해 기본 클래스의 메서드가 제공됩니다. 이 메서드를 사용하여 구성 요소에 예상 입력 및 출력 개체 수가 있는지, 구성 요소의 사용자 지정 속성에 허용되는 값이 있는지, 필요한 경우 모든 연결이 지정되었는지 확인합니다. 또한 이 메서드를 사용하여 입력 및 출력 컬렉션의 열에 올바른 데이터 형식이 있고 각 열의 열이 DTSUsageType 구성 요소에 적절하게 설정되어 있는지 확인합니다. 기본 클래스 구현은 구성 요소의 입력 열 컬렉션을 확인하고 컬렉션의 각 열이 업스트림 구성 요소의 열을 IDTSOutputCollection100 참조하는지 확인하여 유효성 검사 프로세스를 지원합니다.

Validate 메서드

Validate 메서드는 SSIS 디자이너에서 구성 요소를 편집할 때 반복적으로 호출됩니다. 열거형 반환 값을 통해 DTSValidationStatus 및 경고 및 오류를 게시하여 디자이너 및 구성 요소 사용자에게 피드백을 제공할 수 있습니다. DTSValidationStatus 열거형에는 다양한 오류 단계를 나타내는 세 개의 값과 구성 요소가 올바르게 구성되어 있고 실행할 수 있는 상태인지를 나타내는 네 번째 값 VS_ISVALID가 포함되어 있습니다.

값은 VS_NEEDSNEWMETADATA 오류가 존재 ComponentMetaData하며 구성 요소가 오류를 복구할 수 있음을 나타냅니다. 구성 요소에서 복구할 수 있는 메타데이터 오류가 발생하는 경우 메서드의 오류를 Validate 수정해서는 안 되며 ComponentMetaData 유효성 검사 중에 수정해서는 안 됩니다. 대신 Validate 메서드에서는 VS_NEEDSNEWMETADATA만 반환해야 하고, 구성 요소에서는 이 섹션의 뒷부분에 설명된 대로 ReinitializeMetaData 메서드가 호출될 때 오류를 복구해야 합니다.

이 값은 VS_ISBROKEN 구성 요소에 디자이너의 구성 요소를 편집하여 수정할 수 있는 오류가 있음을 나타냅니다. 이 오류는 일반적으로 사용자 지정 속성 또는 지정되지 않았거나 잘못 설정된 필수 연결로 인해 발생합니다.

마지막 오류 값은 VS_ISCORRUPT구성 요소에서 패키지 XML을 편집하거나 개체 모델을 사용하여 속성이 직접 수정된 경우에만 발생 ComponentMetaData 해야 하는 오류를 검색했음을 나타냅니다. 예를 들어 이러한 종류의 오류는 구성 요소가 단일 입력만 추가했지만 유효성 검사에서 둘 이상의 입력이 있는 것을 검색할 때 발생합니다 ComponentMetaData. 이 반환 값을 생성하는 오류는 고급 편집기 대화 상자의 다시 설정 단추를 사용하여 구성 요소를 다시 설정해야만 복구할 수 있습니다.

구성 요소는 오류 값을 반환하는 것 외에도 유효성 검사 중에 경고 또는 오류를 게시하여 피드백을 제공합니다. 및 FireError 메서드는 FireWarning 이 메커니즘을 제공합니다. 이러한 메서드가 호출되면 SSDT(SQL Server Data Tools)의 오류 목록 창에 해당 이벤트가 게시됩니다. 그런 다음, 구성 요소 개발자는 발생한 오류에 대해 사용자에게 직접 피드백을 제공하고 적절한 경우 수정 방법을 제공할 수 있습니다.

다음 코드 예제에서는 재정의된 구현을 보여 있습니다 Validate.

public override DTSValidationStatus Validate()  
{  
    bool pbCancel = false;  
  
    // Validate that there is one input.  
    if (ComponentMetaData.InputCollection.Count != 1)  
    {  
    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, out pbCancel);  
    return DTSValidationStatus.VS_ISCORRUPT;  
    }  
  
    // Validate that the UserName custom property is set.  
    if (ComponentMetaData.CustomPropertyCollection["UserName"].Value == null || ((string)ComponentMetaData.CustomPropertyCollection["UserName"].Value).Length == 0)  
    {  
        ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, out pbCancel);  
        return DTSValidationStatus.VS_ISBROKEN;  
    }  
  
    // Validate that there is one output.  
    if (ComponentMetaData.OutputCollection.Count != 1)  
    {  
        ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, out pbCancel);  
        return DTSValidationStatus.VS_ISCORRUPT;  
    }  
  
    // Let the base class verify that the input column reflects the output   
    // of the upstream component.  
    return base.Validate();  
}  
Public  Overrides Function Validate() As DTSValidationStatus   
  
 Dim pbCancel As Boolean = False  
  
 ' Validate that there is one input.  
 If Not (ComponentMetaData.InputCollection.Count = 1) Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISCORRUPT   
 End If   
  
 ' Validate that the UserName custom property is set.  
 If ComponentMetaData.CustomPropertyCollection("UserName").Value Is Nothing OrElse CType(ComponentMetaData.CustomPropertyCollection("UserName").Value, String).Length = 0 Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISBROKEN   
 End If   
  
 ' Validate that there is one output.  
 If Not (ComponentMetaData.OutputCollection.Count = 1) Then   
   ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, pbCancel)   
   Return DTSValidationStatus.VS_ISCORRUPT   
 End If   
  
 ' Let the base class verify that the input column reflects the output   
 ' of the upstream component.  
  
 Return MyBase.Validate   
  
End Function  

ReinitializeMetaData 메서드

ReinitializeMetaData 메서드는 Validate 메서드에서 VS_NEEDSNEWMETADATA를 반환하는 구성 요소를 편집할 때마다 SSIS 디자이너에서 호출됩니다. 구성 요소에는 유효성 검사 도중 구성 요소에 의해 식별된 문제를 검색하고 수정하는 코드가 포함되어야 합니다.

다음 예제에서는 유효성 검사 중에 문제를 감지하고 메서드에서 ReinitializeMetaData 이러한 오류를 해결하는 구성 요소를 보여 줍니다.

private bool areInputColumnsValid = true;  
public override DTSValidationStatus Validate()  
{  
    IDTSInput100 input = ComponentMetaData.InputCollection[0];  
    IDTSVirtualInput100 vInput = input.GetVirtualInput();  
  
    bool Cancel = false;  
    foreach (IDTSInputColumn100 column in input.InputColumnCollection)  
    {  
        try  
        {  
            IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);  
        }  
        catch  
        {  
            ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, out Cancel);  
            areInputColumnsValid = false;  
            return DTSValidationStatus.VS_NEEDSNEWMETADATA;  
        }  
    }  
  
    return DTSValidationStatus.VS_ISVALID;  
}  
public override void ReinitializeMetaData()  
{  
    if (!areInputColumnsValid)  
    {  
        IDTSInput100 input = ComponentMetaData.InputCollection[0];  
        IDTSVirtualInput100 vInput = input.GetVirtualInput();  
  
        foreach (IDTSInputColumn100 column in input.InputColumnCollection)  
        {  
            IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);  
  
            if (vColumn == null)  
                input.InputColumnCollection.RemoveObjectByID(column.ID);  
        }  
        areInputColumnsValid = true;  
    }  
}  
Private areInputColumnsValid As Boolean = True   
  
Public  Overrides Function Validate() As DTSValidationStatus   
 Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)   
 Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput   
 Dim Cancel As Boolean = False   
 For Each column As IDTSInputColumn100 In input.InputColumnCollection   
   Try   
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)   
   Catch   
     ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, Cancel)   
     areInputColumnsValid = False   
     Return DTSValidationStatus.VS_NEEDSNEWMETADATA   
   End Try   
 Next   
 Return DTSValidationStatus.VS_ISVALID   
End Function   
  
Public  Overrides Sub ReinitializeMetaData()   
 If Not areInputColumnsValid Then   
   Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)   
   Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput   
   For Each column As IDTSInputColumn100 In input.InputColumnCollection   
     Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)   
     If vColumn Is Nothing Then   
       input.InputColumnCollection.RemoveObjectByID(column.ID)   
     End If   
   Next   
   areInputColumnsValid = True   
 End If   
End Sub