Siebel · EIM
Reference / v8.x / Batch Integration

Siebel EIM
Cheat Sheet

Enterprise Integration Manager — Siebel's batch-oriented engine for moving data between interface tables and base tables. Every IFB directive, every column convention, every error code, laid out the way an engineer actually reads them.

Engine
Batch EIM
Interface
EIM_*
Config
.ifb file
Operations
4 verbs
§ 01 · Fundamentals

A two-stage bridge between external systems and Siebel base tables.

External data cannot touch base tables directly — Siebel enforces this rule absolutely. EIM provides the only sanctioned batch path: external source writes to an interface table, EIM reads the interface table, resolves foreign keys, applies user-key logic, and writes to one or many base tables in a single transaction.

Why EIM exists at all

Direct SQL INSERT into S_ORG_EXT or S_CONTACT is unsupported and will corrupt the schema — Siebel's relational design has hundreds of cross-table dependencies, user-key columns, denormalised fields, and audit hooks. EIM is the only batch tool that resolves all of these correctly.

It is verbose, it is slow per row, but it is the only safe way to load 500,000 accounts at 2 a.m. without breaking the application.

01 · INTERFACE TABLE

EIM_ACCOUNT, EIM_CONTACT, EIM_OPTY …

Staging tables prefixed EIM_. They mirror base table columns plus control columns (IF_ROW_BATCH_NUM, IF_ROW_STAT, T_DELETED, T_MERGED_ROW_ID). External systems write here.

02 · IFB FILE

Declarative process configuration

A plain-text configuration file telling EIM what to do: which batch number, which operation, which target tables, which columns to ignore, which user keys to use. One IFB can contain many process steps.

03 · COMPONENT

Server task: "Process Batch"

EIM runs as a Siebel Server component. Submit the IFB via the Process Batch component with a config file path; it reads batches marked FOR_IMPORT and processes them.

04 · BASE TABLES

S_ORG_EXT, S_CONTACT, S_OPTY …

The real Siebel schema. EIM resolves the interface row against user keys, then writes/updates/deletes across every dependent base table in one atomic transaction. Failure rolls back the entire row.

§ 02 · Configuration

The .ifb file is the entire control surface.

Every EIM run is driven by a single ASCII configuration file. Its grammar is bracketed sections, key = value pairs, and shell-style includes. Below is a complete, annotated IFB for an account import.

; ─── Header: declares the process to run ─────────────
[Siebel Interface Manager]
 PROCESS = "Import Accounts"

; ─── Shell process: chains steps in sequence ─────────
[Import Accounts]
 TYPE = SHELL
 INCLUDE = "Import Accounts Step 1"
 INCLUDE = "Clear EIM Table"

; ─── Actual import step ───────────────────────────────
[Import Accounts Step 1]
 TYPE = IMPORT
 BATCH = 1000
 TABLE = EIM_ACCOUNT
 ONLY BASE TABLES = S_ORG_EXT, S_ORG_BU
 ONLY BASE COLUMNS = S_ORG_EXT (NAME, LOC, BU_ID, VIS_ST, ACCNT_FLG),
                       S_ORG_BU (BU_ID, ORG_ID)
 DEFAULT COLUMN = ACCNT_PR_POSTN_ID, "0-R5NH"
 DEFAULT COLUMN = VIS_ST, "Y"
 ATTACH ROWS = "ALL"
 UPDATE ROWS = "ALL"
 INSERT ROWS = S_ORG_EXT, S_ORG_BU
 TRANSACTION BORDER = 1000

; ─── Cleanup step ─────────────────────────────────────
[Clear EIM Table]
 TYPE = DELETE
 BATCH = 1000
 TABLE = EIM_ACCOUNT
 DELETE MATCHES = EIM_ACCOUNT (IF_ROW_BATCH_NUM = 1000)
[SECTION]

Every bracketed section is one process step. The header section tells the EIM component which process to execute — there can be only one per run.

TYPE

One of SHELL (orchestrator), IMPORT, EXPORT, DELETE, or MERGE. SHELL sections only chain other sections via INCLUDE.

BATCH

An integer identifying which rows in the interface table to process. Rows are tagged by setting IF_ROW_BATCH_NUM to this value before running EIM.

ONLY BASE TABLES / COLUMNS

The most important performance directive. Restrict EIM to only the tables and columns you actually need — default behaviour touches every related table.

DEFAULT COLUMN

Provides a constant value for a column when the interface table does not. Useful for hardcoding BU_ID, currency codes, or visibility flags across a whole load.

TRANSACTION BORDER

Number of rows per database commit. Lower = safer, slower. Higher = faster, but a single failure rolls back more rows.

§ 03 · Operations

Four verbs cover every EIM use case.

Each operation has its own TYPE value, its own data direction, and its own interface-table population rules. Memorise these four diagrams and you have 80% of EIM in your head.

TYPE = IMPORT

Import

Load new records or update existing ones. The most common EIM verb — used for every data migration, every ongoing feed from external systems.

External
EIM_*
S_*
TYPE = IMPORT
BATCH = 1000
TABLE = EIM_ACCOUNT
INSERT ROWS = S_ORG_EXT
UPDATE ROWS = S_ORG_EXT
TYPE = EXPORT

Export

Pull data out of base tables into an EIM interface table, then extract via SQL. Used for extracts, migrations out of Siebel, integration with downstream warehouses.

S_*
EIM_*
External
TYPE = EXPORT
BATCH = 2000
TABLE = EIM_ACCOUNT
EXPORT MATCHES = S_ORG_EXT (CREATED > "2024-01-01")
EXPORT ALL ROWS = TRUE
TYPE = DELETE

Delete

Remove rows from base tables. Two flavours: DELETE EXACT matches user keys precisely; DELETE MATCHES uses a WHERE clause on base tables.

EIM_*
S_*
removed
TYPE = DELETE
BATCH = 3000
TABLE = EIM_ACCOUNT
DELETE EXACT = S_ORG_EXT
DELETE MATCHES = S_ORG_EXT (STATUS_CD = "Inactive")
TYPE = MERGE

Merge

Consolidate two records into one — surviving row absorbs the loser's child records, then the loser is deleted. Used for deduplication, account hierarchy consolidation.

Loser
Survivor
Loser gone
TYPE = MERGE
BATCH = 4000
TABLE = EIM_ACCOUNT
MERGE = S_ORG_EXT, ROW_ID
UPDATE ROWS = S_ORG_EXT
§ 04 · Interface Tables

The EIM_* naming convention is rigid.

Every interface table follows the pattern EIM_<ENTITY>, and every entity maps to a primary base table plus its dependents. Below are the tables you will encounter in 95% of EIM work.

EIM_ACCOUNT
→ S_ORG_EXT
AccountOrganisations and internal divisions. Most heavily populated EIM table in any deployment. Also writes S_ORG_BU, S_ACCNT_POSTN, S_ADDR_PER, S_ORG_REL.
EIM_CONTACT
→ S_CONTACT
ContactPeople, both internal employees and external contacts. Pairs with S_POSTN, S_ADDR_PER, S_CONTACT_BU, S_CONTACT_X.
EIM_OPTY
→ S_OPTY
OpportunitySales opportunities. Carries revenue, stage, close date. Touches S_OPTY_POSTN, S_OPTY_CON, S_OPTY_BU, S_STG.
EIM_ORDER
→ S_ORDER
OrderSales orders and line items. Writes S_ORDER, S_ORDER_ITEM, S_ORDER_BU, S_ORDER_POSTN.
EIM_PROD_INT
→ S_PROD_INT
ProductInternal products. Hierarchical — parent product, child product versions. Also writes S_PROD_INT_VEN, S_PROD_INT_PR.
EIM_EMPLOYEE
→ S_EMPLOYEE / S_USER
EmployeeInternal staff. Pairs with S_POSTN (position), S_PARTY (party model), S_USER_BU. Often loaded alongside S_POSTN_CON.
EIM_ACCNT_DTL
→ S_ORG_EXT_X
Account DetailExtension table for account custom attributes — the "_X" suffix denotes extension. Loaded after the parent account row exists.
EIM_ACTIVITY
→ S_EVT_ACT
ActivityService requests, activities, appointments. Touches S_EVT_ACT, S_EVT_ACT_SS, S_EVT_ACTIVITY_X, S_ACT_EMP.
EIM_SRV_REQ
→ S_SRV_REQ
Service RequestCustomer service tickets. Writes S_SRV_REQ, S_SRV_REQ_X, S_SRV_REQ_EMPL, S_REQ_ITEM.
EIM_QUOTE
→ S_DOC_QUOTE
QuoteSales quotes with line items. Touches S_DOC_QUOTE, S_DOC_QUOTE_ITEM, S_QUOTE_POSTN, S_QUOTE_REL.
§ 05 · End-to-end Flow

From flat file to base table in five steps.

Regardless of operation, every EIM run follows the same lifecycle. The diagram below is the entire pipeline — every EIM task you ever debug will map onto these five stages.

i
Step 01

Populate EIM

External source (file, ETL, API) writes rows into the EIM_ interface table. Set IF_ROW_BATCH_NUM to the batch number declared in the IFB.

ii
Step 02

Submit Job

Submit "Process Batch" component job with the IFB file path. EIM reads the header section and starts the declared PROCESS.

iii
Step 03

Resolve Keys

EIM resolves foreign keys using user keys on each target base table. Unresolved foreign keys mark the row as NOT_ALLOWED and skip it.

iv
Step 04

Write Base Tables

Atomic write across all base tables for the row. Either every table for this row commits, or the whole row rolls back.

v
Step 05

Set Status

EIM writes IF_ROW_STAT — IMPORTED, UPDATED, DELETED, MERGED, or one of the failure codes. Inspect this column to triage failures.

§ 06 · Columns

Control columns versus data columns.

Every EIM interface table has two kinds of columns. Control columns drive EIM's behaviour — never written by the source system. Data columns hold the actual payload and map directly to base table columns.

Control Columns

EIM's bookkeeping

IF_ROW_BATCH_NUM
Integer batch identifier. EIM processes only rows whose batch number matches the IFB BATCH value. The source system must set this before submitting the job.
IF_ROW_STAT
Status after processing. IMPORTED = success. NOT_ALLOWED, DUP_ID_EXIST, ROW_LOCKED = various failures. Always inspect this column post-run.
IF_ROW_STAT_NUM
Numeric status code paired with IF_ROW_STAT. Useful for SQL filters when triaging — easier than string comparison on large tables.
T_DELETED
For DELETE operations. Set to Y on rows that should be deleted from base tables.
T_MERGED_ROW_ID
For MERGE operations. Contains the ROW_ID of the surviving record. The current row is the loser and will be removed.
T____RID
Temporary ROW_ID columns for each target base table — used internally by EIM to track row resolution during processing.
Data Columns

The actual payload

NAME, LOC
User key columns. Together with BU_ID, these uniquely identify an account. Never NULL — EIM uses these to determine INSERT vs UPDATE.
ACCNT_PR_POSTN_ID
Primary position for the account — a foreign key to S_POSTN. Must resolve via the position's user key (NAME + DIVISION + ORG).
ACCNT_BU_ID
Business Unit identifier — almost always required. Often set via DEFAULT COLUMN in the IFB rather than from source.
VIS_ST
Visibility flag. Y = visible to all positions; otherwise restricted to primary position. Affects visibility queries.
CUST_STAT_CD
Customer status code. Must match a value in the S_LOV_OF_LIST (list of values) table — invalid LOV codes will reject the row.
*_X columns
Custom extension columns (suffix _X). Map to extension table columns — populated only when the parent base row has been resolved.
§ 07 · Triage

Every failed row leaves a fingerprint in IF_ROW_STAT.

After every EIM run, query SELECT IF_ROW_STAT, COUNT(*) FROM EIM_* GROUP BY IF_ROW_STAT. The status codes below tell you exactly what went wrong and where to look.

IMPORTED
Successfully loaded
Status · OKThe row was inserted into all target base tables. No action needed.
NOT_ALLOWED
Foreign key resolution failed
FixEIM could not resolve one or more foreign keys. Check that referenced accounts, positions, or LOV values exist in base tables before retrying.
DUP_ID_EXIST
Duplicate user key on insert
FixAn INSERT was attempted but a row with the same user key already exists. Change INSERT ROWS to UPDATE ROWS, or pre-clean the source.
ROW_LOCKED
Row locked by another user
FixThe target row is being edited in the Siebel UI. Wait, or coordinate off-hours batch windows with the user community.
REQUIRED_COL_NULL
A required column was NULL
FixInspect the interface row for any user-key or required column that came in empty. Patch the source feed.
PICKLIST_VALUE_INVALID
LOV value not in list of values
FixA status, type, or category column references an LOV code that does not exist in S_LST_OF_VAL. Verify LOV active flag and spelling.
USER_KEY_NAME_NOT_FOUND
User key column missing from interface row
FixEIM needs every column of the user key index to resolve the row. Add the missing column to your source mapping.
INACTIVE_PICKLIST_VALUE
LOV exists but is inactive
FixThe LOV row exists in S_LST_OF_VAL but its ACTIVE_FLG = 'N'. Reactivate it, or use the new active code in your source.
FOREIGN_KEY_VIOLATION
Referential integrity failed at DB level
FixThe database rejected the row because a parent record doesn't exist. Load parents first, then children. Order matters.
PROMPT_COL_NOT_FOUND
Picklist prompt column missing
FixThe IFB requested a picklist validation against a column that does not exist in the interface table. Verify IFB syntax.
§ 08 · Performance

EIM is slow by design. Make it less slow.

Left to its defaults, EIM will examine every related table, every column, every index. For a 500k-row load this means hours. The six directives below are the standard bag of tricks — applied together, they routinely cut run times by 80%.

01

Restrict base tables

Always use ONLY BASE TABLES. Without it, EIM touches every dependent table — for an account that means 12+ tables instead of 2.

02

Restrict base columns

Pair ONLY BASE TABLES with ONLY BASE COLUMNS. Skip columns your source does not populate — EIM will not need to read them.

03

Drop indexes, rebuild after

For very large loads (1M+ rows), drop non-unique indexes on target base tables before EIM and rebuild them after. Index maintenance per row is the single biggest cost.

04

Update statistics first

Run UPDATE STATISTICS on the interface table and target base tables before EIM. The query optimiser needs current stats to choose efficient plans.

05

Batch in parallel

Split one large batch into N smaller batches (e.g. 10 batches of 50k rows). Run them as parallel EIM tasks — different batches do not lock each other.

06

Tune transaction border

Set TRANSACTION BORDER to 1000–5000 rows. Too low = excessive commits. Too high = massive rollback on any single-row failure.

§ 09 · Discipline

The unwritten rules every EIM engineer learns the hard way.