Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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__ActiveActivityNamebam__CompletatoActivityNamebam__RelazioniAttiveActivityNamebam__CompletedRelationshipsbam_
ActivityName_ContinuazioniDove
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
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 nella finestra della query.
Esegui lo script. La procedura memorizzata risultante può essere visualizzata nell'elenco delle procedure memorizzate 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 RemoveDanglingInstancese 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ò 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.