Source: projects/identity-management/knowledge-base/oim-dbqueue-and-object-layer-jobs.md

> Source: projects/identity-management/knowledge-base/oim-dbqueue-and-object-layer-jobs.md

OIM DBQueue and Object-Layer Jobs

Goal: capture durable, version-aware notes about DBQueue insertion (QBM_PDBQueueInsert_*) and object-layer job creation (QBM_PJobCreate*) for One Identity Manager 9.3+ and V10.

Source Priority / Provenance

1. Live sandbox DB (OneIM, V10) on im.sandbox.local; SELECT-only metadata queries on 2026-04-27.

2. Local training / KB material from Viktor's downloads:

3. Vendor docs / release notes:

Version Boundary: 9.2.x vs 9.3+

The important release boundary is 9.3.

Vendor 9.3 release notes say the Database Agent Service was fundamentally revised: process control moved into the Database Agent Service .NET component, and the old database-server control procedure QBM_PWorkDBQueueMain is no longer required. The release notes also say several DBQueue overview/slot/performance tables are read-only views and should not be used as customization foundations.

For 9.3+, treat old training slides about SQL Server Agent jobs, direct slot-agent control, and legacy DBQueue slot-control internals as historical context unless the same behavior is confirmed in current vendor docs or live V10 DB metadata.

Still relevant in 9.3+/V10:

Changed / do not overapply from older material:

QBM_PDBQueueInsert_Single / QBM_PDBQueueInsert_Bulk

Training material frames DBQueue entries as coming from data changes, typically via SQL triggers, stored procedures, or functions. Administrators can also queue recalculations manually through QBM_PDBQueueInsert_Single or QBM_PDBQueueInsert_Bulk, but this should be treated as a targeted repair/development tool, not as normal application integration.

Live V10 sandbox procedure signatures:

ProcedureLive parameters
QBM_PDBQueueInsert_Single@UID_Task, @object, @SubObject, @GenProcID, @Dummy_no_Check_For_Existing, @Dummy_Sort_Order
QBM_PDBQueueInsert_Bulk@UID_Task, @DBQueueElements (QBM_YDBQueueRaw), @Dummy_Sort_Order, @Dummy_no_Check_For_Existing
QBM_PDBQueueInsert_Int@UID_Task, @DBQueueElements (QBM_YDBQueueRaw)
QBM_PDBQueueInsert_WaitForComp@Context, @GenProcID

Observed V10 sandbox usage footprint from sys.sql_modules:

Object typeObjects with QBM_PDBQueueInsert_SingleObjects with QBM_PDBQueueInsert_Bulk
SQL trigger375524
SQL stored procedure5597
SQL scalar function13

Interpretation: DBQueue insertion is not a rare edge mechanism. It is deeply embedded in generated triggers and shipped procedures. Custom use should copy the platform pattern: choose a valid UID_Task, pass the affected object/subobject semantics correctly, and preserve GenProcID traceability.

QBM_PJobCreate*

The local QBM_PJobCreate PDF explains the key architectural reason for these procedures: SQL cannot directly execute object-layer .NET behavior such as templates, formatting scripts, scripts, process generation conditions, or customizer methods. If a DB trigger or DBQueue procedure needs object-layer behavior, it creates Job queue work.

Live V10 sandbox contains 29 procedures named QBM_PJobCreate*, including:

Practical guidance from the local PDF:

Security / operational caution:

Methods Callable Through HOCallMethod

QBM_PJobCreate_HOCallMethod, _B, and _L create HandleObject CallMethod jobs. The target is selected by @objecttype plus either @whereclause or @XObjectKeys; the method is named by @MethodName; up to ten positional method parameters can be passed as @param1 ... @param10.

Important distinction:

Live sandbox examples from DialogMethod / DialogObjectHasMethod:

MethodExample target table/objectMeaning
ITShop_Cancel_OpenOrderPersonWantsOrgCancel an open IT Shop request.
ITShop_ChangeBoard / ITShop_ChangeBoardMultipleITShopOrgMove product nodes/products to another shelf.
ITShop_ChangeShop / ITShop_ChangeShoppingCenterITShopOrgMove IT Shop shelf/shop nodes.
ITShop_ExpiredProductAccProductNotify requesters about phased-out products.
RemoveFromITShopBoardsADSGroup, ESet, LDAPGroup, QERResource, QERReuse, UNSGroupB*, ...Remove an entitlement/resource from all IT Shop shelves.
ADS_Deprovision / ADS_UndoDeprovisionADSAccount, ADSGroupActive Roles deprovision / undo deprovision actions.
RevokeAccountDefADSAccount, ADSContact, LDAPAccount, UNSAccountBRevoke account definition from an account.
DialogSchedule_StartNowDialogScheduleStart a schedule immediately.
QERPolicy.CreateAttestationsQERPolicyCreate attestation cases for policy violations.

Literal object-layer method names found in shipped SQL calls to QBM_PJobCreate_HOCallMethod*:

Method nameObserved use
AbortAbort IT Shop requests / attestation cases from DBQueue or trigger logic.
AssignIT Shop validation/waiting flows.
CompleteCasesUnderConstructionFinish newly created attestation cases.
ESCALATEEscalate approval/attestation decisions.
MakeDecisionAutomatic approval decisions for IT Shop and attestation.
MakeDecisionOnInsertAsyncAsync decision-on-insert flow for PersonWantsOrg.
PrepareAttestationsSchedule-driven attestation preparation.
Replace / Unsubscribe / WaitingIT Shop request-state transitions in ShoppingRack validation.

Practical rule: before using HOCallMethod, verify the target method against either DialogMethod/DialogObjectHasMethod for UI-visible methods or against existing shipped SQL/object-layer documentation for customizer methods. The procedure does not make the method harmless; it only creates a job that asks the object layer to run it.

Events Fireable Through HOFireEvent

QBM_PJobCreate_HOFireEvent, _B, and _L create HandleObject FireEvent jobs. The target is selected by @objecttype plus either @whereclause or @XObjectKeys; the event is named by @EventName; event/process parameters can be passed with @p2/@v2 ... @p31/@v31. Shipped SQL often uses _ParamNameN / _ParamValueN in those parameter pairs to pass process parameters.

The live event catalog is QBMEvent joined to DialogTable; process generation mapping is JobEventGen joined to JobChain. In this V10 sandbox:

Event families observed in the sandbox:

Event familyExamples
Generic object eventsINSERT, UPDATE, DELETE, Insert, Update, Delete, Read
Target-system lifecycleDEPROVISION, UNDO DEPROVISION, HANDLEOUTSTANDING, POSTSYNC, OVERLIMIT
Assignment/removalAssign, Remove, ASSIGN, REMOVE
IT Shop / approvalGRANTED, DENY, DISMISSED, ESCALATE, QUERYTOPERSON, ORDERGRANTED, ORDERREFUSED, REMEMBER_VALIDUNTIL, PRODUCTEXPIRESSOON
Maintenance / server operationsEXECUTE, FROZENDETECT, OVERLIMITDETECT, OVERLIMITWARNING, CHECKVERSION, DeployTargetChanged, GetDeployTargets
Mail/report eventsSENDMAIL, SENDRICHMAIL, GENERATEMAIL, PREVIEWMAIL, REMIND

Literal event names found in shipped SQL calls to QBM_PJobCreate_HOFireEvent* include Assign, Remove, Insert, DecisionRequired, Remind, DeletePRNode, DeployTargetChanged, EXECUTE, FROZENDETECT, OVERLIMITDETECT, OVERLIMITWARNING, Checkversion, GenerateMail, GetDeployTargets, SendMail, SendRichMail, and UpdateSystemSyncs.

Practical rule: an event is a (TableName, EventName) pair, not a global free-form string. Verify it exists in QBMEvent for the target table, then check JobEventGen/JobChain to understand which processes will be generated.

Decompiled Object-Layer Findings

Local V10 application files under F:/Claude/agent-tools/oim/One Identity Manager were decompiled on 2026-04-27 with ilspycmd to verify what HOCallMethod and HOFireEvent do after the SQL procedure creates the Job queue work. The first focused pass inspected VI.DB.dll, QER.Customizer.dll, ATT.Customizer.dll, Common.Customizer.dll, and ADS.Customizer.dll.

A later full local decompile pass covered 1,260 managed assemblies from F:/Claude/agent-tools/oim, scanned 145,636 generated C# files, and generated a searchable relation index at F:/Claude/projects/identity-management/oim-kb-update/local-app/oim-decompile-index.html with machine-readable data beside it at oim-decompile-index-data.json. The full index is static decompile evidence and should be correlated with live DB metadata before acting on a method/event.

The relation index was then joined to live sandbox DB metadata on 2026-04-27. The Database Relations section now includes DialogMethod -> DialogObject -> DialogTable, QBMEvent -> JobEventGen -> JobChain, SQL modules, triggers and parent tables, extracted QBM_PJobCreate_HOCallMethod* / HOFireEvent* calls, and QBM_PDBQueueInsert_Single / _Bulk call sites linked to QBMDBQueueTask where a literal task ID is visible. Evidence note: F:/Claude/projects/identity-management/oim-kb-update/sandbox-db/2026-04-27-oim-db-trigger-method-event-relations.md.

Runtime mechanics observed in VI.DB.dll:

Customizer methods observed in QER.Customizer.dll:

TargetMethods/events found by decompilationPractical meaning
PersonWantsOrgExtended methods include Abort, AbortOrder, MakeDecision, Escalate, Unsubscribe, DirectDecision, RecallDecision, CancelOrder, Prolongate, Reserve, ResetReservation, QueryToPerson, AnswerFromPerson, RecallQuery, FillOrder, Replace, Assign, Waiting, PrepareForMethod, AddAdditional, RevokeAdditional, AddInsteadOf, DenyDecision, RevokeDelegation, MakeDecisionOnInsertAsync, and AddHistoryEntry. Events are registered from the PwOEvents enum as custom-generated events.These are state-machine methods, not generic table actions. The enabled methods depend on the current PWO state and PwOFunction; calling a method through HOCallMethod can still fail if the row is in the wrong state or the caller context lacks required permissions.
PersonWantsOrg event/state modelPwOEvents includes request-decision events such as Granted, Dismissed, OrderGranted, OrderRefused, Aborted, Canceled, Escalate, Direct, Recall, AddAdditional, AddInsteadOf, Deny, RevokeDelegation, RecallQuery, UnsubscribeFinished, and RevokeAdditional.The approval process is implemented as a state graph. Events are generated by state transitions, often on save, so direct event firing should be used only after checking the target table/event/process mapping.
ITShopOrgMethods include MoveProductNode, MoveProducts, MoveBoard, MoveShop, and DeleteBoard; enablement is gated by ITShopInfo (PR, BO, SH).This matches the IT Shop hierarchy model: product nodes, shelves, and shops have different legal move/delete methods. Do not treat all ITShopOrg rows as interchangeable.
ITShopProductCustomizerRegisters RemoveFromITShop with SingleObject and ChangesExternalState behavior.This helps explain UI/catalog actions that remove requestable products from IT Shop shelves. In the DB metadata, related DialogMethod rows such as RemoveFromITShopBoards are assigned to entitlement tables.
Person and related QER classesMethods such as password actions, shopping cart pattern actions, and CreateITShopOrder exist in customizers beyond DialogMethod.DialogMethod is a useful UI/action catalog, but the callable object-layer surface is broader and lives in customizer assemblies.

Customizer methods/events observed in ATT.Customizer.dll:

TargetMethods/events found by decompilationPractical meaning
AttestationCaseCustom-generated events include Aborted, Escalate, Canceled, AddAdditional, RevokeAdditional, AddInsteadOf, Deny, Granted, Dismissed, OrderGranted, FinalDismissed, QueryToPerson, and AnswerFromPerson. Methods include Reserve, ResetReservation, Abort, Escalate, CancelAttestation, AddAdditional, RevokeAdditional, AddInsteadOf, DenyDecision, DirectDecision, RecallDecision, QueryToPerson, AnswerFromPerson, MakeDecision, RecallQuery, RevokeDelegation, and Prolongate.Attestation approval behavior closely parallels IT Shop approval mechanics. Most methods are enabled only while a case is open and valid for the current decision context.
AttestationPolicy / AttestationPolicyGroupFunctions include CreateAttestations, PrepareAttestations, and CompleteCasesUnderConstruction, usually with ChangesExternalState behavior and inactive/construction-state guards.Shipped SQL calls to PrepareAttestations and CompleteCasesUnderConstruction are deliberately delegating heavy object-layer attestation creation/completion logic to the job/object layer.

Operational interpretation:

V10 DBQueue Processing Model

V10 Configuration Guide points that are current for V10:

Live sandbox current QBM\DBQueue config snapshot:

ParameterValueEffective
QBM\DBQueue\BufferTimeout120yes
QBM\DBQueue\ChangeLimitDefault3000yes
QBM\DBQueue\CountSlotsMax5yes
QBM\DBQueue\DefaultRuntime90yes
QBM\DBQueue\KeepAlive20yes
QBM\DBQueue\MaxBulkFactor15000yes
QBM\DBQueue\OverloadLimit200000yes
QBM\DBQueue\GenProcIDReplaceLimit2000no (Enabled=0)

Note: MaxSlotsPerTask is documented in 9.3+/V10 vendor docs, but was not present as an enabled DialogConfigParm row in the current sandbox query output. Verify whether it is represented elsewhere, omitted by this installed module set, or added by a later patch/config transport before relying on it in this sandbox.

Negative Slot Numbers in V10

The training deck mentions negative slot numbers, but the older slide content is incomplete for V10. The V10 Configuration Guide documents these deferral meanings in QBMDBQueueCurrent:

Slot numberMeaning
-1Synchronization is running for the object target system.
-2A database block could not be reset within the given time period.
-3There are still Job queue entries for the object to calculate.
-4There are still prerequisite DBQueue tasks for the object.
-5External condition is not fulfilled yet.
-6Object to calculate is marked as pending.
-11Object was still present from a previous processing run when the slot was filled.
-12Object was still found in the slot after processing.
-23Deadlock occurred during processing.
-24Runtime error occurred during processing.
-25Delta calculation overloaded.
-26Internal error handling.
-500Internal error handling.

Use this V10 list for sandbox/V10 troubleshooting. Keep 9.2.x-and-earlier slot notes as historical background only.

Research Questions Added

Sources