orchestrator
2023.10
false
- Getting Started
- Requirements
- Best Practices
- Installation
- Updating
- Identity Server
- Troubleshooting startup errors

Orchestrator installation guide
Last updated Mar 24, 2026
Before you upgrade
Please make sure to perform these steps before you upgrade to 2023.4+. They help ensure that, once the upgrade is done, you can get started in no time, with zero issues.
- Back up your database to remove any data loss risks.
- Run the pre-upgrade database maintenance script below.
This script removes all expired or consumed grants from the database. This helps speed up the [identity].[PersistedGrants] primary key and index re-creation, and, as such, the database migration.
DECLARE @Now DATETIME2 = GETUTCDATE()
DECLARE @ConsumedGrantsGracePeriod DATETIME2 = DATEADD(hour, -2, @Now)
DECLARE @ConsumedDeleted int = 1
DECLARE @ExpiredDeleted int = 1
DECLARE @BatchSize int = 500
DECLARE @ConsumedBatchesDeleted int = 0
DECLARE @ExpiredBatchesDeleted int = 0
SET LOCK_TIMEOUT 0
SET DEADLOCK_PRIORITY LOW
WHILE (@ConsumedDeleted=1 OR @ExpiredDeleted=1)
BEGIN
IF @ConsumedDeleted=1
BEGIN
BEGIN TRY
DELETE TOP(@BatchSize) FROM [identity].[PersistedGrants] WHERE [ConsumedTime] IS NOT NULL AND [ConsumedTime] < @ConsumedGrantsGracePeriod AND [Type] <> 'reference_token'
IF @@ROWCOUNT = 0
SET @ConsumedDeleted=0
ELSE
SET @ConsumedBatchesDeleted = @ConsumedBatchesDeleted + 1
END TRY
BEGIN CATCH
PRINT 'Failed to delete consumed grants'
END CATCH
END
IF @ExpiredDeleted=1
BEGIN
BEGIN TRY
DELETE TOP(@BatchSize) FROM [identity].[PersistedGrants] WHERE [Expiration] < @Now AND [Type] <> 'reference_token'
IF @@ROWCOUNT = 0
SET @ExpiredDeleted=0
ELSE
SET @ExpiredBatchesDeleted = @ExpiredBatchesDeleted + 1
END TRY
BEGIN CATCH
PRINT 'Failed to delete expired grants'
END CATCH
END
PRINT 'Consumed batches deleted: ' + CONVERT(nvarchar(32), @ConsumedBatchesDeleted)
PRINT 'Expired batches deleted: ' + CONVERT(nvarchar(32), @ExpiredBatchesDeleted)
-- Wait for 10 seconds between deletes
IF (@ExpiredDeleted=1 OR @ConsumedDeleted=1)
WAITFOR DELAY '00:00:05.000'
END
DECLARE @Now DATETIME2 = GETUTCDATE()
DECLARE @ConsumedGrantsGracePeriod DATETIME2 = DATEADD(hour, -2, @Now)
DECLARE @ConsumedDeleted int = 1
DECLARE @ExpiredDeleted int = 1
DECLARE @BatchSize int = 500
DECLARE @ConsumedBatchesDeleted int = 0
DECLARE @ExpiredBatchesDeleted int = 0
SET LOCK_TIMEOUT 0
SET DEADLOCK_PRIORITY LOW
WHILE (@ConsumedDeleted=1 OR @ExpiredDeleted=1)
BEGIN
IF @ConsumedDeleted=1
BEGIN
BEGIN TRY
DELETE TOP(@BatchSize) FROM [identity].[PersistedGrants] WHERE [ConsumedTime] IS NOT NULL AND [ConsumedTime] < @ConsumedGrantsGracePeriod AND [Type] <> 'reference_token'
IF @@ROWCOUNT = 0
SET @ConsumedDeleted=0
ELSE
SET @ConsumedBatchesDeleted = @ConsumedBatchesDeleted + 1
END TRY
BEGIN CATCH
PRINT 'Failed to delete consumed grants'
END CATCH
END
IF @ExpiredDeleted=1
BEGIN
BEGIN TRY
DELETE TOP(@BatchSize) FROM [identity].[PersistedGrants] WHERE [Expiration] < @Now AND [Type] <> 'reference_token'
IF @@ROWCOUNT = 0
SET @ExpiredDeleted=0
ELSE
SET @ExpiredBatchesDeleted = @ExpiredBatchesDeleted + 1
END TRY
BEGIN CATCH
PRINT 'Failed to delete expired grants'
END CATCH
END
PRINT 'Consumed batches deleted: ' + CONVERT(nvarchar(32), @ConsumedBatchesDeleted)
PRINT 'Expired batches deleted: ' + CONVERT(nvarchar(32), @ExpiredBatchesDeleted)
-- Wait for 10 seconds between deletes
IF (@ExpiredDeleted=1 OR @ConsumedDeleted=1)
WAITFOR DELAY '00:00:05.000'
END