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:
ActivityName
bam__ActiveActivityName
bam__CompletedActivityName
bam__ActiveRelationshipsActivityName
bam__CompletedRelationshipsActivityName
bam__ContinuationsDove
ActivityName
è il nome dell'attività definita dall'utente.Durante l'esecuzione normale, i dati incompleti rimangono nella tabella bam_
ActivityName
Active. 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
Aprire SQL Server Management Studio e connettersi al server SQL.
Espandere il nome del server, espandere Database e quindi selezionare il database di importazione primaria BAM.
Fare clic su Nuova query.
Copiare lo script di creazione della stored procedure e incollarlo nel riquadro di query.
Eseguire lo script. La stored procedure risultante può essere visualizzata nell'elenco di stored procedure come dbo.RemoveDanglingInstances.
Rimuovere istanze di attività incomplete
Aprire SQL Server Management Studio e connettersi al server SQL.
Espandere il nome del server, espandere Database e quindi selezionare il database di importazione primaria BAM.
Fare clic su Nuova query.
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, digitareexec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
.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.