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:
C:/Users/vikto/Downloads/One Identity Manager - Employee Empowerment Program (India) - Database Calculations and Processing 1.pptxC:/Users/vikto/Downloads/KNOWLEDGE-1IM - QBM_PJobCreate or how to interact with object layer from SQL-270426-060950.pdfC:/Users/vikto/Downloads/EEP - OneIM Security Features.pptx
3. Vendor docs / release notes:
- One Identity Manager 9.3 Release Notes.
- One Identity Manager 10.0 Configuration Guide.
- One Identity Manager 10.0 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:
- DBQueue is still the database-side calculation/recalculation framework.
- Tasks are queued in
DialogDBQueueand moved toQBMDBQueueCurrentwhile processing. - The Database Agent Service controls processing and slot distribution.
QBMDBQueueTaskandQBMDBQueueTaskDependare still central for task definitions and dependency order.QBMDBQueueTask.CustomWeightcan influence task priority while respecting dependencies.- Bulk processing still exists, with reworked 9.3+ configuration parameters.
Changed / do not overapply from older material:
- Do not base customizations on
QBMDBQueueSlot,QBMDBQueueOverview*, orQBMDBQueueTaskPerf*; 9.3 release notes mark these as read-only views and not customization bases. - Old configuration parameters
QBM | DBServerAgent,QBM | DBServerAgent | CountSlotAgents,QBM | DBServerAgent | CreateNotification,QBM | DBQueue | ChangeLimitMax, andQBM | DBQueue | ChangeLimitMinwere removed in 9.3. - Negative slot-number information from older training decks was incomplete for V10. V10 documents more deferral meanings than just
-1,-2, and-3.
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:
| Procedure | Live 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 type | Objects with QBM_PDBQueueInsert_Single | Objects with QBM_PDBQueueInsert_Bulk |
|---|---|---|
| SQL trigger | 375 | 524 |
| SQL stored procedure | 55 | 97 |
| SQL scalar function | 1 | 3 |
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:
- Generic:
QBM_PJobCreate. - HandleObject wrappers:
QBM_PJobCreate_HOInsert,..._HOUpdate,..._HODelete,..._HOFireEvent,..._HOTemplate,..._HOCallMethod,..._HOImportXML. - Batch/list variants:
_Bvariants process a where clause in batches;_Lvariants take aQBM_YParameterListofXObjectKeyvalues and internally use the batch path. - Utility variants:
QBM_PJobCreate_SendMail,QBM_PJobCreate_SendRMail,QBM_PJobCreate_SQLDel,..._SQLProc,..._Mnt.
Practical guidance from the local PDF:
- Generate a fresh
GenProcIDfor each execution; do not reuse one over long periods because it hurts traceability/historization. - Prefer
@isToFreezeOnError = 1for manual/debuggable jobs. - Be careful with
WhereClause;Update,Delete,FireEvent,Template, andCallMethodvariants often depend on it. HOInsert,HOUpdate, andHODeleterun through the object layer, so templates, format scripts, save scripts, and process generation logic are considered.HOFireEventcan trigger object events and pass process parameters through_paramNameN/_paramValueNindirection.HOTemplateexecutes templates for pipe-separated columns or*, but should be scoped carefully.HOCallMethodcan invoke object methods such as request-decision customizer methods.- Use
_B/_Lvariants for batches or explicit object-key lists instead of hand-building broad one-shot jobs.
Security / operational caution:
- Jobs created this way are normal Job queue work and can execute powerful process components. Treat manual calls as production-impacting changes.
- Some examples in the local PDF intentionally show risky patterns, such as decrypting an encrypted value through a job; that may expose sensitive output in job history. Do not use such examples outside controlled troubleshooting.
- Prefer a supported API/tooling path when available. Use
QBM_PJobCreate*when the actual requirement is "run object-layer behavior from SQL/service context" and the scope is explicit.
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:
DialogMethodis the UI/dialog-method catalog. In this V10 sandbox it contains 45 method definitions and 71 assignments throughDialogObjectHasMethod.HOCallMethodcan also invoke object-layer/customizer methods that are not rows inDialogMethod. Shipped SQL does this for approval and attestation methods such asMakeDecision,Abort,ESCALATE,PrepareAttestations, andMakeDecisionOnInsertAsync.
Live sandbox examples from DialogMethod / DialogObjectHasMethod:
| Method | Example target table/object | Meaning |
|---|---|---|
ITShop_Cancel_OpenOrder | PersonWantsOrg | Cancel an open IT Shop request. |
ITShop_ChangeBoard / ITShop_ChangeBoardMultiple | ITShopOrg | Move product nodes/products to another shelf. |
ITShop_ChangeShop / ITShop_ChangeShoppingCenter | ITShopOrg | Move IT Shop shelf/shop nodes. |
ITShop_ExpiredProduct | AccProduct | Notify requesters about phased-out products. |
RemoveFromITShopBoards | ADSGroup, ESet, LDAPGroup, QERResource, QERReuse, UNSGroupB*, ... | Remove an entitlement/resource from all IT Shop shelves. |
ADS_Deprovision / ADS_UndoDeprovision | ADSAccount, ADSGroup | Active Roles deprovision / undo deprovision actions. |
RevokeAccountDef | ADSAccount, ADSContact, LDAPAccount, UNSAccountB | Revoke account definition from an account. |
DialogSchedule_StartNow | DialogSchedule | Start a schedule immediately. |
QERPolicy.CreateAttestations | QERPolicy | Create attestation cases for policy violations. |
Literal object-layer method names found in shipped SQL calls to QBM_PJobCreate_HOCallMethod*:
| Method name | Observed use |
|---|---|
Abort | Abort IT Shop requests / attestation cases from DBQueue or trigger logic. |
Assign | IT Shop validation/waiting flows. |
CompleteCasesUnderConstruction | Finish newly created attestation cases. |
ESCALATE | Escalate approval/attestation decisions. |
MakeDecision | Automatic approval decisions for IT Shop and attestation. |
MakeDecisionOnInsertAsync | Async decision-on-insert flow for PersonWantsOrg. |
PrepareAttestations | Schedule-driven attestation preparation. |
Replace / Unsubscribe / Waiting | IT 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:
QBMEvent: 353 table/event rows.JobEventGen: 400 event-to-process generation rows.- Some events map to multiple processes.
- Some events can exist without an active process generator, or with process generators disabled by preprocessor. Check
JobChain.NoGenerateandJobChain.IsDeactivatedByPreProcessorbefore assuming a fire will produce executable work.
Event families observed in the sandbox:
| Event family | Examples |
|---|---|
| Generic object events | INSERT, UPDATE, DELETE, Insert, Update, Delete, Read |
| Target-system lifecycle | DEPROVISION, UNDO DEPROVISION, HANDLEOUTSTANDING, POSTSYNC, OVERLIMIT |
| Assignment/removal | Assign, Remove, ASSIGN, REMOVE |
| IT Shop / approval | GRANTED, DENY, DISMISSED, ESCALATE, QUERYTOPERSON, ORDERGRANTED, ORDERREFUSED, REMEMBER_VALIDUNTIL, PRODUCTEXPIRESSOON |
| Maintenance / server operations | EXECUTE, FROZENDETECT, OVERLIMITDETECT, OVERLIMITWARNING, CHECKVERSION, DeployTargetChanged, GetDeployTargets |
| Mail/report events | SENDMAIL, 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:
- HandleObject
CallMethodreadsObjectType,MethodName,WhereClause,Param1,Param2, and following numbered parameters from the job parameters. It loads the matching entities, resolves the named object method, converts string job parameters to the target .NET parameter types, invokes the method, and saves the entity when the method requires saving orSaveis set. MethodNamecan be just a name plus parameter count, or a typed signature form with parentheses. This matters when overloaded methods exist.- String parameters can be converted to primitive target types. Object/entity parameters are passed by object key and loaded by the object layer.
- HandleObject
FireEventloads matching entities, builds an event parameter collection, adds__StartTimewhen provided, calls object-layer process generation, and commits the generated job chains. - Job generation looks for a generated script method named
Event_<EventName>. If the event method or chain assembly is not present, the runtime raises/logs a warning and no chains are created. SoQBMEventis necessary discovery metadata, but it is not by itself proof that a specific fire will create executable work.
Customizer methods observed in QER.Customizer.dll:
| Target | Methods/events found by decompilation | Practical meaning |
|---|---|---|
PersonWantsOrg | Extended 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 model | PwOEvents 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. |
ITShopOrg | Methods 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. |
ITShopProductCustomizer | Registers 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 classes | Methods 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:
| Target | Methods/events found by decompilation | Practical meaning |
|---|---|---|
AttestationCase | Custom-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 / AttestationPolicyGroup | Functions 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:
HOCallMethodis best thought of as "run an object-layer method in a job-service context", not "execute a row inDialogMethod". UseDialogMethodfor UI-visible action discovery, but verify non-UI customizer methods in code, shipped SQL, or vendor documentation.- For
PersonWantsOrgandAttestationCase, method names alone are insufficient. Check current state, enabled functions, parameter shape, and process context. - For
HOFireEvent, validate the target as(table, event), then validateJobEventGenand job-chain generation. A catalog row without a generated chain can produce no work. - Methods marked
ChangesExternalState,NeedsSaving, or implemented as extended methods withOnSaving/OnSavedshould be treated as production-impacting operations even if invoked from SQL.
V10 DBQueue Processing Model
V10 Configuration Guide points that are current for V10:
- The Database Agent Service controls DBQueue task processing and slot distribution.
- Staging level controls defaults for central dispatcher runtime: Development 20 minutes, Test 40 minutes, Production 120 minutes.
QBM | DBQueue | CountSlotsMaxlimits max slots; values below 5 are not permitted except0for hardware-based maximum.QBM | DBQueue | MaxSlotsPerTasklimits how many slots one task type may use; default is 16.- Bulk processing uses:
QBM | DBQueue | DefaultRuntime(default 90 seconds)QBM | DBQueue | MaxBulkFactor(default 15000)QBM | DBQueue | ChangeLimitDefault(default 3000)QBM | DBQueue | OverloadLimit(default 200000)QBMDBQueuePondbuffers DBQueue tasks during synchronization;QBM | DBQueue | BufferTimeoutdefaults to 120 minutes.
Live sandbox current QBM\DBQueue config snapshot:
| Parameter | Value | Effective |
|---|---|---|
QBM\DBQueue\BufferTimeout | 120 | yes |
QBM\DBQueue\ChangeLimitDefault | 3000 | yes |
QBM\DBQueue\CountSlotsMax | 5 | yes |
QBM\DBQueue\DefaultRuntime | 90 | yes |
QBM\DBQueue\KeepAlive | 20 | yes |
QBM\DBQueue\MaxBulkFactor | 15000 | yes |
QBM\DBQueue\OverloadLimit | 200000 | yes |
QBM\DBQueue\GenProcIDReplaceLimit | 2000 | no (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 number | Meaning |
|---|---|
-1 | Synchronization is running for the object target system. |
-2 | A database block could not be reset within the given time period. |
-3 | There are still Job queue entries for the object to calculate. |
-4 | There are still prerequisite DBQueue tasks for the object. |
-5 | External condition is not fulfilled yet. |
-6 | Object to calculate is marked as pending. |
-11 | Object was still present from a previous processing run when the slot was filled. |
-12 | Object was still found in the slot after processing. |
-23 | Deadlock occurred during processing. |
-24 | Runtime error occurred during processing. |
-25 | Delta calculation overloaded. |
-26 | Internal error handling. |
-500 | Internal 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
- How exactly do shipped V10 triggers choose between
QBM_PDBQueueInsert_SingleandQBM_PDBQueueInsert_Bulk, especially for IT Shop / ShoppingRack tasks? - Which
QBM_PJobCreate*calls are used byQER_PITShopProductNodeCreate_band related ShoppingRack procedures, and which object-layer operations do they delegate? - In V10, where is the documented
QBM | DBQueue | MaxSlotsPerTasksetting stored or surfaced in this sandbox, given it did not appear in theDialogConfigParmsnapshot? - Which negative slot numbers actually occur during common sandbox operations (AD sync, IT Shop publish, ShoppingRack refresh), and what is the fastest diagnostic query for each?
- When is manual
QBM_PDBQueueInsert_*repair safer than rerunning the supported UI/API operation, and what audit/journal guardrails should agents use? - Map remaining shipped module customizer assemblies (
ADS,TSB,PAG,POL,RPS,SAP,UNS, etc.) for additional non-DialogMethodmethods that shipped SQL may call throughHOCallMethod. - Build a repeatable query/script that correlates shipped SQL
HOCallMethodmethod names,DialogMethodmetadata, and decompiled customizer registrations. - Build a repeatable query/script that correlates shipped SQL
HOFireEventevent names withQBMEvent,JobEventGen, activeJobChain, and generatedEvent_<EventName>presence where observable.
Sources
- Local source:
C:/Users/vikto/Downloads/One Identity Manager - Employee Empowerment Program (India) - Database Calculations and Processing 1.pptx(extracted 2026-04-27). - Local source:
C:/Users/vikto/Downloads/KNOWLEDGE-1IM - QBM_PJobCreate or how to interact with object layer from SQL-270426-060950.pdf(extracted 2026-04-27). - Local source:
C:/Users/vikto/Downloads/EEP - OneIM Security Features.pptx(extracted 2026-04-27; only lightly relevant for DBQueue maintenance/dynamic-user context). - One Identity Manager 9.3 Release Notes. Source: https://support-public.cfm.quest.com/77417_OneIM_ReleaseNotes.pdf (Accessed: 2026-04-27).
- One Identity Manager 10.0 Configuration Guide. Source: https://support-public.cfm.quest.com/82072_one-identity-manager_configuration_10.0.pdf (Accessed: 2026-04-27).
- One Identity Manager 10.0 Release Notes. Source: https://support-public.cfm.quest.com/82130_one-identity-manager_release-notes_10.0.pdf (Accessed: 2026-04-27).