다음을 통해 공유


불완전한 활동 인스턴스 제거

BAM 정의 파일을 배포하면 정의 파일에 정의된 각 활동에 대해 BAM 기본 가져오기 데이터베이스에 5개의 테이블이 만들어집니다. 이러한 테이블은 다음과 같습니다.

  • ActivityNamebam__Active

  • ActivityNamebam__Completed

  • ActivityNamebam__ActiveRelationships

  • ActivityNamebam__CompletedRelationships

  • ActivityNamebam__Continuations

    여기서 ActivityName 는 사용자가 정의한 활동의 이름입니다.

    정상 실행 중에 불완전한 데이터는 bam_ActivityNameActive 테이블에 유지됩니다. 데이터에 관계 및 참조가 있는 경우 bam\ActivityName_ActiveRelationships 테이블에 데이터가 있습니다.

    Continuation을 사용하는 활동을 추적하는 동안 활동이 불완전한 상태로 BAM 데이터베이스에 남아 있는 인스턴스가 있을 수 있습니다. 이 항목의 끝에 있는 저장 프로시저 생성 스크립트를 사용하여 불완전한 레코드를 제거할 저장 프로시저를 만들 수 있습니다.

    저장 프로시저를 만들려면 SQL Server Management를 사용하여 스크립트를 복사하고 BAM 기본 가져오기 데이터베이스에 대해 실행합니다. 스크립트는 데이터베이스에 RemoveDanglingInstances 라는 저장 프로시저를 생성합니다.

RemoveDanglingInstances 저장 프로시저 만들기

  1. SQL Server Management Studio 열고 SQL Server에 연결합니다.

  2. 서버 이름을 확장하고 데이터베이스를 확장한 다음 BAM 기본 가져오기 데이터베이스를 선택합니다.

  3. 새 쿼리를 클릭합니다.

  4. 저장 프로시저 만들기 스크립트를 복사하여 쿼리 창에 붙여넣습니다.

  5. 스크립트를 실행합니다. 결과로 생성된 저장 프로시저는 저장 프로시저 목록에서 dbo.RemoveDanglingInstances로 볼 수 있습니다.

불완전한 활동 인스턴스 제거

  1. SQL Server Management Studio 열고 SQL Server에 연결합니다.

  2. 서버 이름을 확장하고 데이터베이스를 확장한 다음 BAM 기본 가져오기 데이터베이스를 선택합니다.

  3. 새 쿼리를 클릭합니다.

  4. 쿼리 창에서 수행 중인 제거 작업에 대한 적절한 매개 변수를 입력 exec RemoveDanglingInstances 합니다. 예를 들어 구매 주문 활동의 불완전한 인스턴스를 모두 제거하려면 를 입력합니다 exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'.

  5. 스크립트를 실행합니다.

RemoveDanglingInstances 사용 예

이 저장 프로시저는 다음 4개의 매개 변수를 받을 수 있습니다.

매개 변수 Description
@ActivityName nvarchar(128) 제거할 불완전한 활동 인스턴스의 이름을 지정합니다.
@ActivityId nvarchar(128) (옵션) 저장 프로시저에서 지정된 인스턴스 식별자를 가진 현수 인스턴스만 제거하도록 지정합니다.
@DateThreshold datetime (옵션) 활성 테이블에서 지정된 날짜보다 오래된(같거나 더 오래된 인스턴스가 아니라 더 오래된 인스턴스만) 모든 활성 인스턴스가 제거되도록 지정합니다.
@NewTableExtension nvarchar(30) (옵션) 저장 프로시저에서 제공된 확장을 기존 활동 테이블에 연결하여 3개의 새 테이블을 만들도록 지정합니다.

결과로 생성되는 테이블은 다음과 같습니다.

<bam_ActivityName_Active_Extension>

<bam_ActivityName_ActiveRelationships_Extension>

<bam_ActivityName_Continuations_Extension>

불완전한 인스턴스가 데이터베이스에서 제거되는 대신 새 테이블로 이동됩니다.

테이블이 이미 있으면 저장 프로시저에서 해당 테이블을 다시 사용하고, 그렇지 않으면 새로 만들어집니다. 중요: 테이블이 이미 있는 경우 저장 프로시저는 스키마가 만들어진 경우 사용할 스키마와 일치한다고 가정합니다. 스키마가 일치하지 않으면 저장 프로시저에서 레코드를 삽입하지 못하며 제거 작업이 실패합니다.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'

활성, 활성 관계 및 Continuation 테이블에서 'PurchaseOrder' 활동의 모든 활성 인스턴스를 제거합니다.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567'

'PurchaseOrder' 활동에 대한 활성, 활성 관계 및 Continuation 테이블에서 활동 ID가 'PO220567'인 활동 인스턴스만 제거합니다.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533'

'PurchaseOrder' 활동에 대한 활성, 활성 관계 및 Continuation 테이블에서 LastModified 시간이 Feb 2nd, 2005 7:27:03.533 PM보다 오래된 모든 활동 인스턴스를 제거합니다.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567', @DateThreshold='2005-02-02 19:27:03:533'

LastModified 열이 Feb 2nd, 2005 7:27:03.533 PM보다 오래된 경우에만 활동 ID가 PO220567인 활동 인스턴스를 제거합니다.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533', @NewTableExtension=N'Dangling'

데이터베이스에 다음 테이블을 만듭니다.

bam_PurchaseOrder_Active_Dangling

bam_PurchaseOrder_ActiveRelationships_Dangling

bam_PurchaseOrder_Continuations_Dangling

이 저장 프로시저는 'PurchaseOrder' 활동에 대한 활성, 활성 관계 및 Continuation 테이블에서 Feb 2nd, 2005 7:27:03.533 PM보다 오래된 모든 불완전한 활동 인스턴스를 복사하여 새로 만든 테이블에 삽입합니다. 그런 다음 복사된 활동 인스턴스가 활성, 활성 관계 및 Continuation 테이블에서 제거됩니다.

저장 프로시저 생성 스크립트

EXEC sp_stored_procedures @sp_name = 'RemoveDanglingInstances'  
IF @@ROWCOUNT > 0 DROP PROCEDURE RemoveDanglingInstances  
GO  
  
CREATE PROCEDURE RemoveDanglingInstances  
    @ActivityName nvarchar(128),  
    @ActivityId nvarchar(128) = NULL,  
    @DateThreshold datetime = NULL,  
    @NewTableExtension nvarchar(30) = NULL  
AS  
    DECLARE @QueryString nvarchar(4000)  
    DECLARE @ActiveTableName sysname  
    DECLARE @ActiveRelationshipsTableName sysname  
    DECLARE @ContinuationsTableName sysname  
    DECLARE @DanglingActiveTableName sysname  
    DECLARE @DanglingActiveRelationshipsTableName sysname  
    DECLARE @DanglingContinuationsTableName sysname  
  
    SET @ActiveTableName = 'bam_' + @ActivityName + '_Active'  
    SET @ActiveRelationshipsTableName = 'bam_' + @ActivityName + '_ActiveRelationships'  
    SET @ContinuationsTableName = 'bam_' + @ActivityName + '_Continuations'  
  
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED  
    BEGIN TRAN  
  
    DECLARE @LockActivity nvarchar(128)  
    SELECT @LockActivity = ActivityName  
    FROM bam_Metadata_Activities WITH (XLOCK)  
    WHERE ActivityName = @ActivityName  
  
    EXEC sp_tables @table_name = #DanglingActivities  
    IF @@ROWCOUNT > 0 DROP TABLE #DanglingActivities  
  
    CREATE TABLE #DanglingActivities(ActivityID nvarchar(128) PRIMARY KEY)  
  
    SET @QueryString = N'INSERT INTO #DanglingActivities (ActivityID) SELECT ActivityID FROM [bam_' + @ActivityName + '_Active]'  
  
    IF (@DateThreshold is not NULL) OR (@ActivityId is not NULL)  
    BEGIN  
        SET @QueryString = @QueryString + ' WHERE'  
    END  
  
    IF (@DateThreshold is not NULL)  
    BEGIN  
        SET @QueryString = @QueryString + ' LastModified < N''' + CONVERT(nvarchar(50), @DateThreshold, 109) + ''''  
        IF (@ActivityId is not NULL)  
        BEGIN  
            SET @QueryString = @QueryString + ' AND'  
        END  
    END  
  
    IF (@ActivityId is not NULL)  
    BEGIN  
        SET @QueryString = @QueryString + ' ActivityID = N''' + @ActivityId + ''''  
    END  
  
    EXEC sp_executesql @QueryString  
    SELECT * FROM #DanglingActivities  
  
    SET @QueryString = N''  
  
    -- If the user gave a table extension, the dangling instances will be inserted  
    -- into that table.   
    IF (isnull(@NewTableExtension, '') <> '')  
    BEGIN  
        SET @DanglingActiveTableName = @ActiveTableName + '_' + @NewTableExtension  
        SET @DanglingActiveRelationshipsTableName = @ActiveRelationshipsTableName + '_' + @NewTableExtension  
        SET @DanglingContinuationsTableName = @ContinuationsTableName + '_' + @NewTableExtension  
  
        -- If the table for the dangling instances exists then insert into it  
        -- If the table does not exist, then create the dangling instances table  
        -- and then insert into it. SELECT INTO will do that.  
        EXEC sp_tables @table_name = @DanglingActiveTableName  
        IF @@ROWCOUNT > 0  
        BEGIN  
            SET @QueryString = N'INSERT INTO ' + '[' + @DanglingActiveTableName + '] SELECT active.* FROM [' + @ActiveTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
        ELSE  
        BEGIN  
            SET @QueryString = N'SELECT active.* INTO [' + @DanglingActiveTableName + '] FROM [' + @ActiveTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
  
        -- Now do what you did for the Active Instances table for the   
        -- ActiveRelationships table  
        EXEC sp_tables @table_name = @DanglingActiveRelationshipsTableName  
        IF @@ROWCOUNT > 0  
        BEGIN  
            SET @QueryString = N'INSERT INTO ' + '[' + @DanglingActiveRelationshipsTableName + '] SELECT active.* FROM [' + @ActiveRelationshipsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
        ELSE  
        BEGIN  
            SET @QueryString = N'SELECT active.* INTO [' + @DanglingActiveRelationshipsTableName + '] FROM [' + @ActiveRelationshipsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
  
        -- And finally for the continuations table  
        EXEC sp_tables @table_name = @DanglingContinuationsTableName  
        IF @@ROWCOUNT > 0  
        BEGIN  
            SET @QueryString = N'INSERT INTO ' + '[' + @DanglingContinuationsTableName + '] SELECT active.* FROM [' + @ContinuationsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ParentActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
        ELSE  
        BEGIN  
            SET @QueryString = N'SELECT active.* INTO [' + @DanglingContinuationsTableName + '] FROM [' + @ContinuationsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ParentActivityID = dangling.ActivityID'  
            EXEC sp_executesql @QueryString  
        END  
    END  
  
    -- Remove the dangling instances from the Active Instances Table  
    SET @QueryString = 'DELETE FROM [' + @ActiveTableName + '] FROM [' + @ActiveTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID '  
    EXEC sp_executesql @QueryString  
  
    SET @QueryString = 'DELETE FROM [' + @ActiveRelationshipsTableName + '] FROM [' + @ActiveRelationshipsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ActivityID = dangling.ActivityID '  
    EXEC sp_executesql @QueryString  
  
    SET @QueryString = 'DELETE FROM [' + @ContinuationsTableName + '] FROM [' + @ContinuationsTableName + '] active INNER JOIN #DanglingActivities dangling ON active.ParentActivityID = dangling.ActivityID '  
    EXEC sp_executesql @QueryString  
  
    DROP TABLE #DanglingActivities  
  
    COMMIT TRAN      
GO  

불완전한 인스턴스를 확인하는 또 다른 방법

SQL 쿼리를 사용하여 BAMPrimaryImport 데이터베이스에서 불완전한 작업 인스턴스를 resolve 수도 있습니다. 불완전한 활동 인스턴스 해결을 참조하세요.

참고 항목

BAM 데이터베이스 관리