BAM 定義ファイルを展開すると、定義ファイルで定義されたアクティビティごとに 5 つのテーブルが BAM プライマリ インポート データベースに作成されます。 次の表を示します。
bam_
ActivityName
_アクティブbam_
ActivityName
_完了bam_
ActivityName
_ActiveRelationshipsbam_
ActivityName
_完了した関係bam_
ActivityName
_継続ここで
ActivityName
は、ユーザーが定義したアクティビティの名前です。通常の実行中、不完全なデータは bam_
ActivityName
Active テーブルに残ります。データにリレーションと参照がある場合は、bam\ActivityName
_ActiveRelationships テーブルにデータが存在します。継続を使用するアクティビティの追跡中に、BAM データベースでアクティビティが不完全な状態のままになる場合があります。 このトピックの最後にあるストアド プロシージャ作成スクリプトを使用して、不完全なレコードを消去するストアド プロシージャを作成できます。
ストアド プロシージャを作成するには、スクリプトをコピーし、SQL Server 管理を使用して 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 つのパラメーターを受け取ることができます。
パラメーター | 説明 |
---|---|
@ActivityName nvarchar(128) | 削除する不完全なアクティビティ インスタンスの名前を指定します。 |
@ActivityId nvarchar(128) | (省略可能)ストアド プロシージャが、指定したインスタンス識別子を持つ未解決のインスタンスのみを削除することを指定します。 |
@DateThreshold の datetime | (省略可能) 指定した日付より古く、指定した日付と等しくないアクティブなテーブル内のすべてのアクティブなインスタンスが削除されるように指定します。 |
@NewTableExtension nvarchar(30) | (省略可能)指定された拡張機能を既存のアクティビティ テーブルに連結して、ストアド プロシージャが 3 つの新しいテーブルを作成することを指定します。 結果のテーブルは次のようになります。 bam_ActivityName_Active_<Extension> bam_ActivityName_ActiveRelationships_<拡張機能> bam_ActivityName_Continuations_<拡張> 不完全なインスタンスは、データベースから消去されるのではなく、新しいテーブルに移動されます。 テーブルが既に存在する場合、ストアド プロシージャはテーブルを再利用します。それ以外の場合は作成されます。 大事な: テーブルが既に存在する場合、ストアド プロシージャは、そのスキーマが作成された場合に使用されるスキーマと一致することを前提としています。 スキーマが一致しない場合、ストアド プロシージャはレコードの挿入に失敗し、削除操作は失敗します。 |
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
アクティブ、リレーションシップ、継続テーブル内の「PurchaseOrder」アクティビティのすべてのアクティブなインスタンスを削除します。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567'
アクティビティ ID が 'PO220567' のアクティビティ インスタンスのみを、アクティブ、アクティブなリレーションシップ、および 'PurchaseOrder' アクティビティの継続テーブルから削除します。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533'
2005 年 2 月 2 日 7:27:03.533 PM より前の LastModified 時刻を持つすべてのアクティビティ インスタンスを、"PurchaseOrder" アクティビティのアクティブな、アクティブなリレーションシップ、および継続テーブルから削除します。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567', @DateThreshold='2005-02-02 19:27:03:533'
LastModified 列が 2005 年 2 月 2 日午後 7:27:03.533 より古い場合にのみ、アクティビティ ID がPO220567されているアクティビティ インスタンスを削除します。
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533', @NewTableExtension=N'Dangling'
データベースに次のテーブルを作成します。
bam_PurchaseOrder_Active_Dangling
bam_注文書_アクティブな関係_未完了
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 データベースから不完全なアクティビティ インスタンスを解決することもできます。 不完全なアクティビティ インスタンスの解決を参照してください。