Condividi tramite


Rimuovere le istanze incomplete dell'attività

Quando si distribuisce un file di definizione BAM, nel database di importazione primaria BAM vengono create cinque tabelle, una per ogni attività definita nel file di definizione. Queste tabelle sono:

  • ActivityNamebam__Active

  • ActivityNamebam__Completed

  • ActivityNamebam__ActiveRelationships

  • ActivityNamebam__CompletedRelationships

  • ActivityNamebam__Continuations

    Dove ActivityName è il nome dell'attività definita dall'utente.

    Durante l'esecuzione normale, i dati incompleti rimangono nella tabella bam_ActivityNameActive. Se i dati hanno relazioni e riferimenti, nella tabella bam\ActivityName_ActiveRelationships saranno presenti dati.

    Durante il rilevamento di attività che utilizzano continuazioni, è possibile che si presentino istanze nelle quali un'attività viene lasciata in uno stato incompleto nei database BAM. È possibile utilizzare lo script di creazione di stored procedure alla fine di questo argomento per creare una stored procedure che consenta di eliminare i record incompleti.

    Per creare la stored procedure, copiare lo script ed eseguirlo sul database di importazione primaria BAM utilizzando SQL Server Management. Lo script genererà una stored procedure denominata RemoveDanglingInstances nel database.

Creare la stored procedure RemoveDanglingInstances

  1. Aprire SQL Server Management Studio e connettersi al server SQL.

  2. Espandere il nome del server, espandere Database e quindi selezionare il database di importazione primaria BAM.

  3. Fare clic su Nuova query.

  4. Copiare lo script di creazione della stored procedure e incollarlo nel riquadro di query.

  5. Eseguire lo script. La stored procedure risultante può essere visualizzata nell'elenco di stored procedure come dbo.RemoveDanglingInstances.

Rimuovere istanze di attività incomplete

  1. Aprire SQL Server Management Studio e connettersi al server SQL.

  2. Espandere il nome del server, espandere Database e quindi selezionare il database di importazione primaria BAM.

  3. Fare clic su Nuova query.

  4. Nel riquadro query digitare exec RemoveDanglingInstances e i parametri appropriati per l'operazione di rimozione eseguita. Ad esempio, per rimuovere tutte le istanze incomplete dell'attività Ordine di acquisto, digitare exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'.

  5. Eseguire lo script.

Esempi di utilizzo di RemoveDanglingInstances

La stored procedure può accettare quattro parametri:

Parametro Descrizione
@ActivityName nvarchar(128) Specifica il nome dell'istanza di attività incompleta da rimuovere.
@ActivityId nvarchar(128) (Facoltativo) Specifica che la stored procedure rimuoverà solo l'istanza tralasciata con l'identificatore di istanza specificato.
@DateThreshold datetime (Facoltativo) Specifica che tutte le istanze attive nella tabella attiva precedenti (non equivalenti e precedenti, solo precedenti) alla data indicata verranno rimosse.
@NewTableExtension nvarchar(30) (Facoltativo) Specifica che la stored procedure crea tre nuove tabelle concatenando l'estensione fornita alle tabelle di attività esistenti.

Le tabelle risultanti saranno le seguenti:

<bam_ActivityName_Active_Extension>

<bam_ActivityName_ActiveRelationships_Extension>

<bam_ActivityName_Continuations_Extension>

Le istanze incomplete vengono spostate nelle nuove tabelle anziché essere eliminate dal database.

Se le tabelle esistono già, le stored procedure le riutilizzano, altrimenti vengono create. Importante: Se le tabelle esistono già, la stored procedure presuppone che gli schemi corrispondano a quelli che verranno usati se sono stati creati. Se uno schema non corrisponde, la stored procedure non riuscirà a inserire i record e l'operazione di rimozione avrà esito negativo.

exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'

Rimuove tutte le istanze attive dell'attività 'PurchaseOrder' presenti nelle tabelle attive, delle relazioni attive e delle continuazioni.

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

Rimuove solo l'istanza dell'attività con ID attività 'PO220567' dalle tabelle attive, delle relazioni attive e delle continuazioni per l'attività 'PurchaseOrder'.

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

Rimuove tutte le istanze dell'attività con ora di LastModified precedente alle 19:27:03.533 del 2 febbraio 2005 dalle tabelle attive, delle relazioni attive e delle continuazioni per l'attività 'PurchaseOrder'.

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

Rimuove l'istanza dell'attività con ID di attività PO220567 solo se la relativa colonna LastModified è precedente alle 19:27:03.533 del 2 febbraio 2005.

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

Crea le tabelle seguenti nel database:

bam_PurchaseOrder_Active_Dangling

bam_PurchaseOrder_ActiveRelationships_Dangling

bam_PurchaseOrder_Continuations_Dangling

La stored procedure copia tutte le istanze di attività incomplete precedenti alle 19:27:03.533 del 2 febbraio 2005 dalle tabelle attive, delle relazioni attive e delle continuazioni per l'attività 'PurchaseOrder' e le inserisce nelle nuove tabelle create. Le istanze dell'attività copiate vengono quindi rimosse dalle tabelle attive, delle relazioni attive e delle continuazioni.

Script di creazione delle stored procedure

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  

Un altro metodo di risoluzione di istanze incomplete

È anche possibile risolvere istanze di attività incomplete dal database BAMPrimaryImport usando una query SQL. Vedere Risolvere le istanze di attività incomplete.

Vedere anche

Gestione dei database BAM