移除未完成的活動執行個體
部署 BAM 定義檔案時,會為定義檔案中所定義的每個活動,在 BAM 主要匯入資料庫中建立五個資料表, 分別是:
ActivityName
bam__Activebam_
ActivityName
_CompletedActivityName
bam__ActiveRelationshipsActivityName
bam__CompletedRelationshipsActivityName
bam__Continuations其中
ActivityName
是使用者已定義之活動的名稱。在正常執行期間,不完整的資料會保留在 bam_
ActivityName
Active 資料表中。如果資料具有關聯和參考,則 bam\ActivityName
_ActiveRelationships 資料表中會有資料。追蹤使用接續的活動期間,有時候在 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) | (選擇性) 指定預存程序藉由串連所提供的延伸模組與現有活動資料表,建立三個新資料表。 產生的資料表為: <bam_ActivityName_Active_Extension> <bam_ActivityName_ActiveRelationships_Extension> <bam_ActivityName_Continuations_Extension> 未完成的執行個體會移至新資料表,而不會從資料庫清除。 如果資料表已存在,預存程序便會重複加以使用,否則會建立這些資料表。 重要: 如果資料表已經存在,預存程式會假設其架構符合建立時所使用的架構。 如果結構描述不符合,預存程序將無法插入記錄,而且移除作業會失敗。 |
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
移除作用中資料表、作用中關係資料表和接續資料表內 'PurchaseOrder' 活動的所有作用中執行個體。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567'
從作用中資料表、作用中關係資料表和接續資料表,只移除具有活動識別碼 'PO220567' 之 'PurchaseOrder' 活動的活動執行個體。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533'
從作用中資料表、作用中關係資料表和接續資料表,移除 LastModified 時間早於 2005 年 2 月 2 日下午 7:27:03.533 之 'PurchaseOrder' 活動的所有活動執行個體。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567', @DateThreshold='2005-02-02 19:27:03:533'
只有在 LastModified 欄早於 2005 年 2 月 2 日下午 7:27:03.533 時,才移除活動識別碼為 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
預存程序會從作用中資料表、作用中關係資料表和接續資料表,複製早於 2005 年 2 月 2 日下午 7:27:03.533 之 'PurchaseOrder' 活動的所有未完成活動執行個體,並將它們插入新建的資料表中。 接著從作用中資料表、作用中關係資料表和接續資料表移除已複製的活動執行個體。
預存程序建立指令碼
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 資料庫解析不完整的活動實例。 請參閱 解析不完整的活動實例。