불완전한 활동 인스턴스 제거
BAM 정의 파일을 배포하면 정의 파일에 정의된 각 활동에 대해 BAM 기본 가져오기 데이터베이스에 5개의 테이블이 만들어집니다. 이러한 테이블은 다음과 같습니다.
ActivityName
bam__ActiveActivityName
bam__CompletedActivityName
bam__ActiveRelationshipsActivityName
bam__CompletedRelationshipsActivityName
bam__Continuations여기서
ActivityName
는 사용자가 정의한 활동의 이름입니다.정상 실행 중에 불완전한 데이터는 bam_
ActivityName
Active 테이블에 유지됩니다. 데이터에 관계 및 참조가 있는 경우 bam\ActivityName
_ActiveRelationships 테이블에 데이터가 있습니다.Continuation을 사용하는 활동을 추적하는 동안 활동이 불완전한 상태로 BAM 데이터베이스에 남아 있는 인스턴스가 있을 수 있습니다. 이 항목의 끝에 있는 저장 프로시저 생성 스크립트를 사용하여 불완전한 레코드를 제거할 저장 프로시저를 만들 수 있습니다.
저장 프로시저를 만들려면 SQL Server Management를 사용하여 스크립트를 복사하고 BAM 기본 가져오기 데이터베이스에 대해 실행합니다. 스크립트는 데이터베이스에 RemoveDanglingInstances 라는 저장 프로시저를 생성합니다.
RemoveDanglingInstances 저장 프로시저 만들기
SQL Server Management Studio 열고 SQL Server에 연결합니다.
서버 이름을 확장하고 데이터베이스를 확장한 다음 BAM 기본 가져오기 데이터베이스를 선택합니다.
새 쿼리를 클릭합니다.
저장 프로시저 만들기 스크립트를 복사하여 쿼리 창에 붙여넣습니다.
스크립트를 실행합니다. 결과로 생성된 저장 프로시저는 저장 프로시저 목록에서 dbo.RemoveDanglingInstances로 볼 수 있습니다.
불완전한 활동 인스턴스 제거
SQL Server Management Studio 열고 SQL Server에 연결합니다.
서버 이름을 확장하고 데이터베이스를 확장한 다음 BAM 기본 가져오기 데이터베이스를 선택합니다.
새 쿼리를 클릭합니다.
쿼리 창에서 수행 중인 제거 작업에 대한 적절한 매개 변수를 입력
exec RemoveDanglingInstances
합니다. 예를 들어 구매 주문 활동의 불완전한 인스턴스를 모두 제거하려면 를 입력합니다exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
.스크립트를 실행합니다.
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 수도 있습니다. 불완전한 활동 인스턴스 해결을 참조하세요.