Source: projects/identity-management/oim-kb-update/sandbox-db/2026-04-27-itshop-productnode-jobcreate-and-dbqueueinsert-db-evidence.md
> Source: projects/identity-management/oim-kb-update/sandbox-db/2026-04-27-itshop-productnode-jobcreate-and-dbqueueinsert-db-evidence.md
Sandbox DB Evidence — IT Shop ProductNode + JobCreate + DBQueue insert selection (2026-04-27)
This note captures live OneIM sandbox DB evidence (SELECT-only) for:
- which procedures/queues are used for IT Shop “ShoppingRack” tasks
- where
QBM_PJobCreate_*appears in the IT Shop product-node creation flow - how triggers choose between
QBM_PDBQueueInsert_BulkvsQBM_PDBQueueInsert_Single
Evidence 1: ShoppingRack DBQueue task config (QBMDBQueueTask)
Rows where UID_Task LIKE 'QER-K-ShoppingRack%':
UID_Task ProcedureName IsBulkEnabled BulkLimit CountParameter IsWithoutTransaction IsNoGenProcIDCheck ChangeLimit ExecutionDelaySeconds CustomWeight
-------- ------------- ------------- --------- -------------- -------------------- ------------------ ----------- --------------------- ------------
QER-K-ShoppingRack-All QER_ZITShopCheckStructure True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackCheckDecision QER_ZITShopCheckDecision True 0 1 False True 3000 0 0,00
QER-K-ShoppingRackCheckValid QER_ZITShopCheckValid True 0 1 False True 3000 0 0,00
QER-K-ShoppingRackCheckWaiting QER_ZITShopCheckWaiting True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackMakeDecisionCD QER_ZITShopMakeDecisionCD True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackMakeDecisionEX QER_ZITShopMakeDecisionEX True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackMakeDecisionRI QER_ZITShopMakeDecisionRI True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackMakeDecisionSB QER_ZITShopMakeDecisionSB True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackMakeDecisionWC QER_ZITShopMakeDecisionWC True 0 1 True False 3000 0 0,00
QER-K-ShoppingRackMemberDel QER_ZITShopMemberDelete True 0 2 False False 3000 0 0,00
QER-K-ShoppingRackMethod QER_ZITShopCheckMethodBO True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackPersonHasObject QER_ZITShopPersonHasObjectFill True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackProductNode QER_ZITShopCheckMethodPR True 0 1 False False 3000 0 0,00
QER-K-ShoppingRackPWODecisionMaker QER_ZITShopDecisionMakerFill False 0 0 False False 3000 0 0,00
QER-K-ShoppingRackPWOHelperPWO QER_ZITShopHelperFill True 0 1 False True 3000 0 0,00
QER-K-ShoppingRackPWOHelperPWO-Cfg QER_ZITShopHelperFill_Cfg True 0 1 False True 3000 0 0,00
QER-K-ShoppingRackPWOHelperPWO-Del QER_ZITShopHelperFill_Delete False 0 0 True True 0 0 0,00
QER-K-ShoppingRackPWOHelperPWO-Rec QER_ZITShopHelperFill_Recalc False 0 0 False True 0 0 0,00
Evidence 2: QER_PITShopProductNodeCreate_b calls QBM_PJobCreate_HOUpdate
Snippet around QBM_PJobCreate_HOUpdate (shows HOUpdate + then direct UPDATE ITShopOrg ... UID_AccProduct):
eClauseOrg = concat('UID_ITShopOrg = '''
, bu.UID1 , '''') , @BasisObjectKey = dbo.QBM_FCVElementToObjectKey1('ITShopOrg', 'UID_ITShopOrg', bu.UID1) , @uid_AccProduct = bu.UID2 from @ElementBufferJob
bu where bu.ElementIndex = @ElementIndex exec QBM_PJobCreate_HOUpdate 'ITShopOrg', @whereclauseOrg, @GenProcID , @ObjectKeysAffected = default , @p1 =
'uid_ACCProduct' , @v1 = @uid_accproduct , @BasisObjectKey = @BasisObjectKey , @isToFreezeOnError = 1 , @Retries = 2 select @SQLCmd = concat('update ITShopOrg set UID_AccProduct = '''
, @uid_ACCProduct, ''' where ', @WhereClauseOrg) exec sp_executesql @SQLCmd select @ElementIndex += 1 end END TRY BEGIN CATCH exec QBM_PSessionErrorAdd
default declare @Rethrow varchar(1000) = dbo.QBM_FGISessionErrorRethrow() RAISERROR (@Rethrow, 18, 1) WITH NOWAIT END CATCH ende: exec QBM_PSessionContextSet
'GenProcID', @GenProcID_R exec QBM_PSessionContextSet 'XUser', @XUser_R select top 1 @uid_OrgPR = s.UID_OrgPR from #Struktur s return end
Snippet around BaseTreeHasObject (product node ↔ object key placement wiring):
flüssig aber Pferd und Apotheke
and not exists ( select top 1 1
from '
, bu.UID1 , ' e
where e.UID_Org = s.uid_OrgPR
and e.' , bu.UID2 , ' = s.RightTablePKValue
)
', '
insert into BaseTreeHasObject (UID_BaseTreeHasObject, UID_Org, ObjectKey
, InheritInfo, XObjectKey
)
-- 35301 die Bildung des Wertes muß exakt so sein wie in QER_PBasetreeHsObject_PostProc
select dbo.QBM_FCVStringToGUIDMAll(null, s.UID_OrgPR, s.ObjectKeyElement) , s.UID_OrgPR , s.ObjectKeyElement
, '
, @StringQERFGIBitPatternInheritInfo_Direct , ', dbo.QBM_FCVElementToObjectKey1(''BaseTreeHasObject'', ''UID_BaseTreeHasObject'', dbo.QBM_FCVStringToGUIDMAll(null, s.UID_OrgPR, s.ObjectKeyElement))
from #struktur s
where s.MiddleBaseName = '''
, bu.UID1 , '''
and s.CreatePRNode = 1
and s.RemoveThePRNode = 0
-- eigentlich überflüssig aber Pferd und Apotheke
and Not exists (select top 1 1
from BaseTreeHasObject bho
where bho.UID_Org = s.UID_OrgPR
and bho.ObjectKey = s.ObjectKeyElement
)
'
) from @ElementBufferFall4 bu where bu.ElementIndex = @ElementIndex exec sp_executesql @SQLCmd if @IsSimulationMode = 1 begin select @SQLCmd = concat
('
declare @SimulationModeBuffer QBM_YTriggerOperation
insert into @SimulationModeBuffer (operation, BaseObjectType, ColumnName, Objectkey, OldValue)
select ''I'', ''ITShopOrg'', '''',
dbo.QBM_FCVElementToObjectKey1(''ITShopOrg'',
Evidence 3: QER_TIBaseTree uses UID_OrgRoot='QER-V-ITShopOrg' gating
Snippet around the IT Shop OrgRoot marker:
ect, genprocid
) select x.uid, null, @GenProcID from ( select i.uid_org as uid from inserted i ) as x exec QBM_PDBQueueInsert_Bulk 'QER-K-BaseTreeCollectionF',
@DBQueueElements_03 declare @DBQueueElements_05 QBM_YDBQueueRaw insert into @DBQueueElements_05 (object, subobject, genprocid) select x.uid, null, @GenProcID
from ( select i.uid_org as uid from inserted i where i.uid_orgroot = 'QER-V-ITShopOrg' and i.itshopinfo in ('SC', 'SH', 'BO', 'PR') ) as x exec QBM_PDBQueueInsert_Bulk
'QER-K-ShoppingRack-All', @DBQueueElements_05 if exists (select top 1 1 from inserted i where i.ITShopInfo > ' ' and i.UID_OrgRoot not in ('QER-V-ITShopOrg'
, 'QER-V-ITShopSrc') ) begin raiserror('#LDS#Cannot set IT Shop information, because role class is not suitable for IT Shop.|', 18, 2) with nowait end
if exists (select top 1 1 from inserted i left outer join BaseTree p on i.UID_ParentOrg = p.UID_Org and i.UID_OrgRoot = p.UID_OrgRoot where i.UID_ParentOrg
> ' ' and p.UID_Org is null ) begin raiserror( '#LDS#Cannot insert node, because predecessor does not exist in the same role class.|', 18, 2) with nowait
end insert into BaseTreecollection (uid_org, uid_parentorg) select x.uid_org, x.uid_parentorg from ( select i.UID_Org as UID_Org, i.UID_Org as UID_ParentOrg
from inserted i join OrgRoot r on i.UID_OrgRoot = r.UID_OrgRoot union select i.UID_Org, c.UID_ParentOrg from BaseTreeCollection c join inserted i on c.UID_Org
= i.UID_ParentOrg join OrgRoot r on i.UID_OrgRoot = r.UID_OrgRoot where i.IsCutNode = 0 and r.IsTopDown = 1 and i.UID_ParentOrg > ' ' ) as x where not
exists (select top 1 1 from BaseTreecollection bc where bc.uid_org = x.uid_org and bc.uid_parentorg = x.uid_parentorg ) declare @DBQueueElements_06 QBM_YDBQueueRaw
insert into @DBQueueElements_06 (Object, SubObject, GenProcID) select x.uid, null, @GenProcID from ( select i.UID_Org as uid from inserted i ) as x
exec QBM_PDBQueueInsert_Bulk 'QER-K-AllForOneOrg', @DBQueueElements_06 declare @DBQueueElements_07 QBM_YDBQueueRaw insert into @DBQueueElements_07 (object
, subobject, genprocid) select x.uid, null, @GenProcID from ( select uid_personHead as uid from inserted where uid_personHea
Evidence 4: ADS_TUAdsGroup chooses Single vs Bulk insert by load threshold
Snippet around QBM_PDBQueueInsert_Single (shows conditional ...Single vs ...Bulk):
ocID from ( select distinct top (@LoadLimit) aig.uid_ADSAccount
as uid from @GroupsChanged g join adsAccountInADSGroup aig on g.Parameter1 = aig.uid_ADSGroup and aig.XOrigin > 0 ) as x select @LoadSumme = @@ROWCOUNT
if @debugSwitch > 0 begin print 'Accounts zugewiesen, @LoadSumme ' + str(@LoadSumme) end if @LoadSumme >= @loadlimit begin exec QBM_PDBQueueInsert_Single
'QBM-K-CommonReCalculate', 'ADS-K-ADSAccountInADSGroup', '', @genprocid end else begin exec QBM_PDBQueueInsert_Bulk 'ADS-K-ADSAccountInADSGroup', @DBQueueElements_01
end if @LoadSumme < @LoadLimit begin declare @DBQueueElements_02 QBM_YDBQueueRaw insert into @DBQueueElements_02 (object, subobject, genprocid)
select x.uid, null, @GenProcID from ( select top (@LoadLimit) u.UID_ADSAccount as uid from @GroupsChanged g join BaseTreeHasObject bho on g.Parameter2
= bho.ObjectKey join PersonInBaseTree pho on bho.UID_Org = pho.UID_Org join ADSAccount u on u.UID_Person = pho.UID_Person union select top (@LoadLimit
) u.UID_ADSAccount as uid from @GroupsChanged g join BaseTreeHasObject bho on g.Parameter2 = bho.ObjectKey join HelperPersonOrg pho on bho.UID_Org = pho.UID_Org
join ADSAccount u on u.UID_Person = pho.UID_Person union select top (@LoadLimit) u.UID_ADSAccount as uid from @GroupsChanged g join ESetHasEntitlement
ehe on g.Parameter2 = ehe.Entitlement join PersonHasESet phe on phe.UID_ESet = ehe.UID_ESet join ADSAccount u on u.UID_Person = phe.UID_Person ) as x
select @LoadSumme += @@ROWCOUNT end if @debugSwitch > 0 begin print 'Accounts irgendwie geerbt, @LoadSumme ' + str(@LoadSumme) end if @LoadSumme >=
@loadlimit begin exec QBM_PDBQueueInsert_Single 'QBM-K-CommonReCalculate', 'ADS-K-ADSAccountInADSGroup', '', @genprocid end else begin exec QBM_PDBQueueInsert_Bulk
'ADS-K-ADSAccountInADSGroup', @DBQueueElements_02 end declare @DBQueueElements_03 QBM_YDBQueueRaw insert into @DBQueueElements_03 (object, subobject
, genprocid) select x.uid, null, @GenProcID from ( sel
Notes / Interpretation (sandbox-specific)
- ShoppingRack tasks are configured as bulk-enabled in
QBMDBQueueTask(most haveIsBulkEnabled = 1). QER_PITShopProductNodeCreate_buses both object-layer job creation (QBM_PJobCreate_HOUpdate) and direct SQL updates (in the same proc body).- Triggers may explicitly call
...Bulkor...Singleand can decide at runtime (e.g., ADS group inheritance load-limit case).