Entfernen von unvollständigen Aktivitätsinstanzen
Wenn eine BAM-Definitionsdatei bereitgestellt wird, werden in der primären BAM-Importdatenbank fünf Tabellen für jede in der Definitionsdatei definierte Aktivität erstellt. Es handelt sich um folgende Tabellen:
ActivityName
bam__ActiveActivityName
bam__CompletedActivityName
bam__ActiveRelationshipsActivityName
bam__CompletedRelationshipsActivityName
bam__ContinuationsDabei
ActivityName
ist der Name der Aktivität, die der Benutzer definiert hat.Während der normalen Ausführung verbleiben unvollständige Daten in der bam_
ActivityName
Active-Tabelle. Wenn die Daten Beziehungen und Verweise aufweisen, befinden sich Daten in der Tabelle bam\ActivityName
_ActiveRelationships.Beim Überwachen von Aktivitäten, die Fortsetzungen verwenden, kann es vorkommen, dass eine Aktivität in den BAM-Datenbanken in einem unvollständigen Status verbleibt. Mit dem Skript zum Erstellen der gespeicherten Prozedur am Ende dieses Themas können Sie eine gespeicherte Prozedur zum Löschen der unvollständigen Datensätze erstellen.
Zum Erstellen der gespeicherten Prozedur kopieren Sie das Skript und führen Sie es mit SQL Server Management Studio für die primäre BAM-Importdatenbank aus. Das Skript generiert eine gespeicherte Prozedur mit dem Namen RemoveDanglingInstances in der Datenbank.
Erstellen der gespeicherten Prozedur RemoveDanglingInstances
Öffnen Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit sql Server her.
Erweitern Sie den Servernamen, erweitern Sie Datenbanken, und wählen Sie dann die primäre BAM-Importdatenbank aus.
Klicken Sie auf Neue Abfrage.
Kopieren Sie das Skript zur Erstellung der gespeicherten Prozedur, und fügen Sie es in den Abfragebereich ein.
Führen Sie das Skript aus. Die resultierende gespeicherte Prozedur kann in der Liste der gespeicherten Prozeduren als dbo angezeigt werden. RemoveDanglingInstances.
Entfernen unvollständiger Aktivitätsinstanzen
Öffnen Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit sql Server her.
Erweitern Sie den Servernamen, erweitern Sie Datenbanken, und wählen Sie dann die primäre BAM-Importdatenbank aus.
Klicken Sie auf Neue Abfrage.
Geben
exec RemoveDanglingInstances
Sie im Abfragebereich die entsprechenden Parameter für den von Ihnen ausgeführten Entfernungsvorgang ein. Um beispielsweise alle unvollständigen Instanzen der Aktivität "Bestellung" zu entfernen, geben Sie einexec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
.Führen Sie das Skript aus.
Verwendungsbeispiele für 'RemoveDanglingInstances'
Die gespeicherte Prozedur kann vier Parameter empfangen:
Parameter | BESCHREIBUNG |
---|---|
@ActivityName nvarchar(128) | Gibt den Namen der zu löschenden unvollständigen Aktivitätsinstanz an. |
@ActivityId nvarchar(128) | (Optional) Gibt an, dass die gespeicherte Prozedur nur die verwaiste Instanz mit dem angegebenen Instanzbezeichner entfernen soll. |
@DateThreshold datetime | (Optional) Gibt an, dass alle aktiven Instanzen in der aktiven Tabelle entfernt werden, die älter (nicht gleich und älter, nur älter) als das angegebene Datum sind. |
@NewTableExtension nvarchar(30) | (Optional) Gibt an, dass die gespeicherte Prozedur durch Anfügen der übergebenen Erweiterung an die vorhandenen Aktivitätstabellen drei neue Tabellen erstellt. Dies führt zu folgenden Tabellen: <bam_ActivityName_Active_Extension> <bam_ActivityName_ActiveRelationships_Extension> <bam_ActivityName_Continuations_Extension> Die unvollständigen Instanzen werden nicht aus der Datenbank gelöscht, sondern in die neuen Tabellen verschoben. Wenn die Tabellen bereits vorhanden sind, werden sie von der gespeicherten Prozedur wiederverwendet, andernfalls werden sie erstellt. Wichtig: Wenn die Tabellen bereits vorhanden sind, geht die gespeicherte Prozedur davon aus, dass ihre Schemas mit denen übereinstimmen, die beim Erstellen verwendet würden. Wenn ein Schema abweicht, können die Datensätze von der gespeicherten Prozedur nicht eingefügt werden, und der Entfernungsvorgang schlägt fehl. |
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder'
Entfernt alle aktiven Instanzen der Aktivität PurchaseOrder aus den Tabellen bam_PurchaseOrder_Active, bam_PurchaseOrder_ActiveRelationships und bam_PurchaseOrder_Continuations.
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567'
Entfernt nur die Aktivitätsinstanz mit der Aktivitäts-ID PO220567 aus den Tabellen bam_PurchaseOrder_Active, bam_PurchaseOrder_ActiveRelationships und bam_PurchaseOrder_Continuations.
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533'
Entfernt alle Aktivitätsinstanzen, die zuletzt vor dem 2. Februar 2005, 19:27:03,533 Uhr geändert wurden, aus den Tabellen bam_PurchaseOrder_Active, bam_PurchaseOrder_ActiveRelationships und bam_PurchaseOrder_Continuations.
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @ActivityId = 'PO220567', @DateThreshold='2005-02-02 19:27:03:533'
Entfernt die Aktivitätsinstanz mit der Aktivitäts-ID PO220567 nur, wenn sie zuletzt vor dem 2. Februar 2005, 19:27:03,533 Uhr geändert wurde.
exec RemoveDanglingInstances @ActivityName = 'PurchaseOrder', @DateThreshold='2005-02-02 19:27:03:533', @NewTableExtension=N'Dangling'
Erstellt in der Datenbank die folgenden Tabellen:
bam_PurchaseOrder_Active_Dangling
bam_PurchaseOrder_ActiveRelationships_Dangling
bam_PurchaseOrder_Continuations_Dangling
Die gespeicherte Prozedur kopiert alle unvollständigen Aktivitätsinstanzen, die zuletzt vor dem 2. Februar 2005, 19:27:03,533 Uhr geändert wurden, aus den Tabellen bam_PurchaseOrder_Active, bam_PurchaseOrder_ActiveRelationships und bam_PurchaseOrder_Continuations und fügt sie in die entsprechenden neu erstellten Tabellen ein. Anschließend werden die kopierten Aktivitätsinstanzen aus den ursprünglichen Tabellen entfernt.
Skript zum Erstellen der gespeicherten Prozedur
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
Eine weitere Methode zum Auflösen unvollständiger Instanzen
Sie können auch unvollständige Aktivitätsinstanzen aus der BAMPrimaryImport-Datenbank auflösen, indem Sie eine SQL-Abfrage verwenden. Weitere Informationen finden Sie unter Auflösen unvollständiger Aktivitätsinstanzen.