次の方法で共有


不完全なアクティビティ インスタンスの削除

BAM 定義ファイルを展開すると、定義ファイルで定義されたアクティビティごとに 5 つのテーブルが BAM プライマリ インポート データベースに作成されます。 次の表を示します。

  • bam_ActivityName_アクティブ

  • bam_ActivityName_完了

  • bam_ActivityName_ActiveRelationships

  • bam_ActivityName_完了した関係

  • bam_ActivityName_継続

    ここで ActivityName は、ユーザーが定義したアクティビティの名前です。

    通常の実行中、不完全なデータは bam_ActivityNameActive テーブルに残ります。データにリレーションと参照がある場合は、bam\ActivityName_ActiveRelationships テーブルにデータが存在します。

    継続を使用するアクティビティの追跡中に、BAM データベースでアクティビティが不完全な状態のままになる場合があります。 このトピックの最後にあるストアド プロシージャ作成スクリプトを使用して、不完全なレコードを消去するストアド プロシージャを作成できます。

    ストアド プロシージャを作成するには、スクリプトをコピーし、SQL Server 管理を使用して 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 つのパラメーターを受け取ることができます。

パラメーター 説明
@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 データベースから不完全なアクティビティ インスタンスを解決することもできます。 不完全なアクティビティ インスタンスの解決を参照してください。

こちらもご覧ください

BAM データベースの管理