Condividi tramite


Rimuovere istanze di attività incomplete

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

  • ActivityNamebam__Active

  • ActivityNamebam__Completato

  • ActivityNamebam__RelazioniAttive

  • ActivityNamebam__CompletedRelationships

  • bam_ActivityName_Continuazioni

    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 delle attività che usano le continuazioni, possono essere presenti istanze in cui un'attività viene lasciata in uno stato incompleto nei database BAM. È possibile utilizzare lo script di creazione della stored procedure alla fine di questo argomento per creare una stored procedure che elimina i record incompleti.

    Per creare la stored procedure, copiare lo script ed eseguirlo nel database di importazione primaria BAM usando 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 nella finestra della query.

  5. Esegui lo script. La procedura memorizzata risultante può essere visualizzata nell'elenco delle procedure memorizzate 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ò ricevere quattro parametri:

Parametro Descrizione
@ActivityName nvarchar(128) Specifica il nome dell'istanza di attività incompleta da rimuovere.
@ActivityId nvarchar(128) (Facoltativo) Specifica che la procedura memorizzata rimuove solo l'istanza sospesa con l'identificatore di istanza indicato.
@DateThreshold datetime (Facoltativo) Specifica che tutte le istanze attive nella tabella attiva, che sono precedenti alla data specificata (escludendo quelle uguali ma solo quelle più vecchie), vengono rimosse.
@NewTableExtension nvarchar(30) (Facoltativo) Specifica che la stored procedure crea tre nuove tabelle concatenando l'estensione fornita alle tabelle attività esistenti.

Le tabelle risultanti saranno:

<bam_ActivityName_Active_Extension>

<bam_NomeAttività_RelazioniAttive_Estensione>

<bam_ActivityName_Continuations_Estensione>

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

Se le tabelle esistono già, la stored procedure li riutilizza; in caso contrario, vengono creati. Importante: Se le tabelle esistono già, la stored procedure presuppone che gli schemi corrispondano a quelli che verrebbero usati se fossero 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' nelle tabelle delle attività 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 delle attività 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 di attività con un'ora di UltimaModifica precedente al 2 febbraio 2005, 19:27:03.533 dalle tabelle attive, relazioni attive e conti di continuazione per l'attività 'PurchaseOrder'.

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

Rimuove l'istanza dell'attività il cui ID attività è PO220567 solo se la colonna LastModified è precedente al 2 febbraio 2005 7:27:03.533 PM.

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

Crea le tabelle seguenti nel database:

bam_OrdineAcquisto_Attivo_Sospeso

bam_OrdineDiAcquisto_RelazioniAttive_Sospese

bam_PurchaseOrder_Continuations_Dangling

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

Script di creazione della procedura memorizzata

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 le istanze di attività incomplete dal database BAMPrimaryImport usando una query SQL. Vedere Risolvere le istanze di attività incomplete.

Vedere anche

Gestione dei database BAM