# OpenText / eDocs migration connector
Migrates documents from OpenText eDocs Document Management (formerly PC DOCS) into SharePoint Online matter sites provisioned by Epona ProvisioningService.
DLL: Epona.Migrate.OpenText.dll
Audience
Technical consultants with SharePoint and Epona365 knowledge and basic familiarity with OpenText eDocs. Read the migration overview before starting.
# What it does
The OpenText connector connects directly to the OpenText eDocs SQL Server database (the DOCSADM schema) and migrates documents to SharePoint by matter code. It supports:
- Document retrieval — reads documents directly from the eDocs database and file storage
- Metadata preservation — maps eDocs document properties to SharePoint columns
- Permission migration — exports document- and folder-level security from eDocs and applies it in SharePoint
- Document type routing — maps eDocs document types to SharePoint content types and target folders
- Delta migration — tracks what has already been migrated; subsequent runs process only new or changed documents
- Flexible selection — import by a
PROFILEfield value (Field mode), or recreate a whole eDocs folder or workspace subtree (Folder/Workspace mode) - Upload method — direct CSOM upload (default), or the Azure Blob upload pipeline when
UseAzureBlobStorageis enabled in the SharepointCfg - Attachment migration — eDOCS DM "attachments" (e.g. a signed PDF or redline attached to a document) are migrated as their own SharePoint document; see eDOCS attachments
- Multi-filed documents — a document filed under more than one eDocs folder is migrated once, into its oldest folder; an optional Shortcuts pass links it into its other folders — see Multi-filed documents
Upload method
By default the connector uploads documents directly to SharePoint with CSOM. When SettingsCfg.Migrate.UseAzureBlobStorage is enabled in the SharepointCfg, the connector instead uses the Azure Blob upload pipeline (the same mechanism the iManage connector uses): documents are encrypted, uploaded to an Azure Blob container and queued for SharePoint's migration import. CSOM is used to overwrite a version that was already imported in a previous run. The Monitor window opens automatically after Import starts to track job progress — see Azure migration jobs and monitor.
# How it differs from other connectors
Unlike the filesystem or Box connectors, the OpenText connector:
- Connects directly to the eDocs SQL Server database — no vendor API required; the connector reads the eDocs SQL Server database directly and reads document binaries from the eDocs file storage (network share)
- Creates the tracking tables next to the source data — the
_EDMSDocument(and other_EDMS*) tables are created automatically inside the eDocs SQL Server database on the first run. Set MigrationDatabase on the database connection to place them in a separate database on the same SQL Server instead, leaving the eDocs database untouched.
# Prerequisites
- OpenText eDocs deployed and accessible via SQL Server
- SQL Server login with read access to the
DOCSADMschema and write access to create and populate the_EDMS*tracking tables (in the eDocs database, or in the separate MigrationDatabase if configured) - Read access to the eDocs file storage (network share where document binaries are stored)
- Target SharePoint matter sites provisioned by Epona ProvisioningService
- SharepointCfg JSON file configured with the target SharePoint tenant credentials
# Deployment
- Copy
Epona.Migrate.OpenText.dllto theEpona.Migrate.exeapplication directory - Start
Epona.Migrate.exe— the OpenText tab appears automatically - Configure the database connection and OpenText settings (see steps below)
# Step 1 — Configure the connection
The OpenText connector connects to the eDocs SQL Server database using the Database dropdown in the main window.
In the main window, click Create/Edit Database
Add a new connection and set the following fields:
Field Value Name Descriptive identifier (e.g., ClientName-eDocs)Server SQL Server hostname or instance (e.g., edocs-sqloredocs-sql\SQLINSTANCE)Database eDocs database name (typically DOCSADM)UserName Leave blank for Windows integrated authentication, or enter a SQL Server login Password Leave blank for Windows integrated authentication, or enter the password MigrationDatabase (Optional) Name of a separate database on the same SQL Server to hold the migration tracking tables ( _EDMS*). Leave blank to create them in the eDocs database itself. See Separate migration database.Click Save — the connection appears in the main Database dropdown
Select the connection from the Database dropdown
TIP
The connection must reach the SQL Server database that contains the DOCSADM schema (tables such as DOCSADM.PROFILE, DOCSADM.MATTER, DOCSADM.CLIENT). The connector creates the _EDMSDocument (and other _EDMS*) tracking tables in the dbo schema on the first run, if they don't exist yet — in the eDocs database, or in MigrationDatabase if configured.
# Separate migration database
By default the _EDMS* tracking tables are created in the eDocs database. To keep that database untouched, set MigrationDatabase to the name of another database on the same SQL Server. The connector then creates and reads the tracking tables there, addressing them via three-part names ([MigrationDatabase].dbo._EDMSDocument) over the single connection — so delta queries can still join the tracking data to the eDocs source tables.
The migration account then needs, on MigrationDatabase:
CREATE TABLE— to create the_EDMS*tables on the first run (and timestamped backup copies on Remove)db_datareader,INSERT,UPDATE— to read and record migration progressALTER— to truncate the tracking table when using Remove; if not granted, the connector falls back toDELETE
The MigrationDatabase must already exist on the server; the connector creates only the tables, not the database. Read access to the DOCSADM.* tables in the eDocs database is still required.
Use one MigrationDatabase per distinct eDocs source database
_EDMSDocument.Source stores the raw eDocs DOCNUMBER — there is no column recording which source database it came from. Pointing two different eDocs databases at the same MigrationDatabase risks a DOCNUMBER collision: a document in one source database can match a tracking row created for an unrelated document that happens to share the same number in the other source database, causing it to be silently skipped (or its recorded target location corrupted). Use a separate MigrationDatabase for each distinct eDocs source database.
This does not apply to successive restores of the same source database for delta runs (see Migrating from a database copy) — there, every restore shares the same DOCNUMBERs for the same real documents, so reusing one MigrationDatabase across restores is the whole point.
# Step 2 — Configure settings
In the OpenText tab, click the ... button next to the configuration dropdown to open the OpenText Configuration editor. Settings are grouped into three categories.
# Global
| Setting | Type | Default | Description |
|---|---|---|---|
Name | string | — | Required. Unique name for this configuration — saved as Config\OpenText\{Name}.json |
Debug | bool | false | Enable verbose debug logging |
SimulatePlaceholderFiles | bool | false | Test only — never enable for a real migration. Uploads a small placeholder text file instead of each document's real content, so migration structure/metadata/permissions/versioning can be exercised without the physical eDocs files present. When enabled, SharePoint ends up with placeholder content, not the source document. |
# Migrate
| Setting | Type | Default | Description |
|---|---|---|---|
ClientMatterSeparator | char | @ | Character used to split the value entered in the Workspace(s) text box into a client code and a matter code. Only needed when matter codes are not unique in the source — i.e., the same matter code can exist under different clients. For example, entering ABC@001 with separator @ yields client ABC and matter 001. If the entered value does not contain the separator, it is treated as a matter code only. If set to null, splitting is disabled and the entire input is treated as a matter code. |
CombineClientAndMatterCodeToMatterCode | string | — | If set, combines the client code and matter code into a single matter code using this character as the separator (e.g., _ produces ABC_001). Use this when the target matter site in SharePoint is identified by a combined client-matter code rather than the matter code alone. If empty, the matter code from the source is used as-is for the SharePoint target lookup. |
ImportDocumentPermissions | bool | false | Migrate document-level permissions from eDocs to SharePoint. Before enabling, read the performance impact warning in Step 6 — a high number of uniquely secured documents can significantly degrade SharePoint performance. If false, no document permissions are migrated. On an environment using Azure Blob upload, enabling this together with UseAzureBlobStorage is blocked at import time (the Blob manifest does not carry permissions) — apply permissions from the Step 6 export instead. |
ImportFolderPermissions | bool | false | Migrate folder-level permissions during Folder and Workspace import (see Step 4b). When enabled, each created SharePoint folder receives the eDocs folder's ACLs, mapped through the same Permission…ToRoleDefinition settings as documents; when disabled, folders inherit permissions from their parent. The import start prompt states whether folder-permission import is on. No effect in Field import mode. |
CreateEmptyDirectories | bool | false | Create empty folders in SharePoint for eDocs folders that contain no documents. Applies to Folder and Workspace import. |
FolderUseDocName | bool | true | Name SharePoint folders (Folder/Workspace import) from DOCSADM.PROFILE.DOCNAME instead of DOCSADM.FOLDER_ITEM.DISPLAYNAME. Most eDocs configurations use DOCNAME as the effective folder name shown to users. Set to false to use the older FOLDER_ITEM.DISPLAYNAME behavior. Warning: changing this setting on a migration already in progress can create a second, parallel folder tree — wherever DOCNAME and DISPLAYNAME differ, the changed setting computes a different folder name than earlier runs used, so the import doesn't recognize the existing folder and creates a new one instead. |
AppendDocNumberToNames | string | — | Document names (DOCSADM.PROFILE.DOCNAME, case-insensitive) that get the eDocs document number appended (<name> <docnumber>) to make the SharePoint upload name unique — same idea as the automatic handling already applied to email documents. One name per line or semicolon-separated. Use it for names the Dump output's Duplicate Document Names sheet flags as heavily duplicated in one folder, to avoid Import's automatic (1), (2), ... free-name polling, which slows down as the folder fills. Matched against the base document name — one entry also covers every eDOCS attachment of a matching document, since the attachment-type suffix (e.g. (PDF)) is added after the document number: Memo configured yields Memo 12345 for the document and Memo 12345 (PDF) for its PDF attachment. See Duplicate document names. |
TrackChangesInDocumentProfile | bool | false | By default a document is re-imported only when a version's content changed (its DOCSADM.VERSIONS.LASTEDITDATE). Enable this to also re-import when the document's profile/metadata changed — the delta check then additionally compares DOCSADM.PROFILE.LAST_PRF_EDIT_DATE, so a metadata-only edit (for example a renamed document or a changed custom field) re-uploads the latest version to push the updated columns to SharePoint. Ignored on older schemas that lack LAST_PRF_EDIT_DATE. Side effect: SharePoint's Modified date then reflects the later of the content edit and the metadata edit. |
TimeZone | integer | 93 (UTC) | Time zone of the date columns in the source eDocs database. The connector converts document Created/Modified dates from this time zone to UTC before writing them to SharePoint. eDocs stores these dates in UTC, so the default 93 (UTC = no conversion) is correct for virtually all databases — leave it at UTC. Only change it if you have verified the source values are not UTC; a wrong setting shifts every Created/Modified date in SharePoint by the offset. To confirm, compare a document's date in the eDocs client against the raw CREATION_DATE/CREATION_TIME in the database; if those stored values are genuinely not UTC, set this to the time zone the values are in (see the SharePoint time zone IDs (opens new window)). A Date Only SharePoint column (used for a Date-typed custom field) is written at noon UTC so the displayed date stays correct for any site timezone within ±12 hours of UTC; a site timezone outside that range (UTC+13/+14, e.g. New Zealand or Kiribati) can display the date one day later than the source value. |
PermissionReadToRoleDefinition | string | Read | SharePoint role definition name assigned for eDocs Read permission. If empty, eDocs Read grants are not mapped to any SharePoint role. |
PermissionReadWriteToRoleDefinition | string | Contribute | SharePoint role definition name assigned for eDocs Read/Write permission. If empty, eDocs Read/Write grants are not mapped. |
PermissionFullAccessToRoleDefinition | string | Full Control | SharePoint role definition name assigned for eDocs Full Access permission. If empty, eDocs Full Access grants are not mapped. |
PermissionNoneToRoleDefinition | string | — | SharePoint role definition name assigned for eDocs No Access permission. If empty, eDocs No Access entries are skipped and no permission is written. |
DocumentTypeToContentTypes | string | — | Maps eDocs document type IDs to SharePoint content type names. Format: DOCTYPE1=ContentTypeName1;DOCTYPE2=ContentTypeName2; (semicolon-separated) or one mapping per line. Both formats are equivalent — newlines are converted to semicolons internally. If empty, all documents fall through to DefaultDocumentContentType or DefaultEmailContentType. |
DefaultDocumentContentType | string | — | Default SharePoint content type for documents whose type is not in DocumentTypeToContentTypes. If empty, the document library's default content type is used. |
DefaultEmailContentType | string | — | Fallback content type for email documents not matched by DocumentTypeToContentTypes. If empty, the email content type from the DMS Configuration list is used. Content type resolution order for emails: (1) ForceEmailContentType in SharepointCfg wins if set; (2) DocumentTypeToContentTypes if the email's document type is mapped; (3) this setting; (4) DMS Configuration list. |
DocumentTypeToFolders | string | — | Maps eDocs document type IDs to target subfolder paths within the document library. Format: DOCTYPE1=Correspondence;DOCTYPE2=Contracts; (semicolon-separated) or one mapping per line. Applied per document based on its document type. If a workspace redirect with a subfolder is specified (e.g., 001234=NEWCODE/Correspondence), that subfolder takes precedence and DocumentTypeToFolders is not applied for that run. If empty (and no redirect subfolder), documents are uploaded to the document library root. |
ReplaceFolders | string | — | Transforms source folder paths before they are created in SharePoint, during Folder/Workspace import (no effect in Field mode). Supports renaming, stripping prefixes, skipping folders (__SKIP__), catch-all defaults, and root mapping (__ROOT__). See Folder path mapping for full syntax and examples. |
MatterField | string | — | DOCSADM.PROFILE column name used to select documents for import. Documents are filtered by comparing this column to the value entered in the Workspace(s) field, matched on the stored value (i.e. the SYSTEM_ID for lookup and user columns). Usually a matter custom field (for example, FRB_LGLFILE), but any PROFILE column works — including user columns such as AUTHOR or TYPIST to import by a user's SYSTEM_ID (see Choosing the field to import by). When a database connection is selected, the configured column is validated against DOCSADM.PROFILE on save. Leave empty if the database does not use a field for matter identification. |
ReplaceUserNames | string | — | Maps eDocs user IDs (USER_ID) to SharePoint/Microsoft 365 login names. Applied to the document Author, CreatedBy and ModifiedBy fields and to user permission entries. Format: USER_ID=user@domain.com; (semicolon-separated) or one mapping per line. Fill the _M365UserName column on the Users dump sheet and copy the _UserMapping column here. Unmapped users are written through unchanged. This is OpenText-specific — it does not use the shared SettingsCfg.ReplaceUserGroupNames. |
ReplaceGroupNames | string | — | Maps eDocs group IDs (GROUP_ID) to SharePoint/Microsoft 365 group names. Applied to group permission entries. Format: GROUP_ID=SharePoint Group Name; (semicolon-separated) or one mapping per line. Fill the _M365GroupName column on the Groups dump sheet and copy the _GroupMapping column here. Unmapped groups are written through unchanged. OpenText-specific. |
# Metadata
These settings map eDocs metadata fields to SharePoint column names. Leave empty to skip writing the corresponding column.
| Setting | Description |
|---|---|
Author | SharePoint column (internal name) that receives the eDocs document author (USER_ID, mapped through ReplaceUserNames). If empty, the author column is not written. |
DocumentNumber | SharePoint column (internal name) for the eDocs document number (without version). If empty, the column is not written. |
DocumentNumberVersion | SharePoint column (internal name) for the eDocs document number combined with the version (e.g., 12345.1). If empty, the column is not written. |
DocumentType | SharePoint column (internal name) for the eDocs document type code. If empty, the column is not written. |
CustomFields | Maps eDocs custom field column names (as they appear on DOCSADM.PROFILE) to SharePoint column internal names. Format: OTFieldName=SharePointColumnName;OTFieldName2=SharePointColumnName2 (semicolon-separated) or one mapping per line. The CustomFields sheet in the Dump output lists available custom field names (requires DOCSADM.ATTRIBUTE). For lookup-type fields (integer foreign keys referencing a lookup table), the connector automatically resolves the integer to a display value (DESCRIPTION preferred, then NAME, then CODE). To force a specific lookup column instead of relying on auto-resolve, append it to the field name with a dot: OTFieldName.CODE=SharePointColumnName. A trailing dot with nothing after it (OTFieldName.=SharePointColumnName) explicitly requests DESCRIPTION — equivalent to the plain form. The system person columns AUTHOR, TYPIST, LAST_EDITED_BY, LAST_PRF_EDITED_BY, and LAST_LOCKED_BY are recognized specially and always look up against DOCSADM.PEOPLE (e.g. AUTHOR.FULL_NAME=AuthorFullName, AUTHOR.USER_ID=AuthorUserId) rather than a table named after the column. Multiple entries that target the same SharePoint column are concatenated space-separated, in the order listed, skipping any that are empty — useful for keeping a legacy identity readable (e.g. AUTHOR.USER_ID=MLCBarCode;AUTHOR.FULL_NAME=MLCBarCode writes jsmith John Smith to MLCBarCode). A bare mapping with no dot (e.g. AUTHOR=Col) migrates the raw SYSTEM_ID integer for these system person columns rather than a name — use the dot form (AUTHOR.FULL_NAME=Col) to write readable text instead; cross-reference the integer against SYSTEM_ID on the Users dump sheet if one was already migrated this way. If the eDocs database is an older version without custom fields, the setting is silently ignored. |
FixedFields | Writes a literal, fixed value to a SharePoint column on every migrated document, regardless of source data. Format: SharePointColumnName=FixedValue;SharePointColumnName2=FixedValue2 (semicolon-separated) or one mapping per line. Unlike CustomFields, the value is not read from eDocs — it always overwrites the column with the configured value. |
# Remapping field values
The CustomFields and DocumentType settings control which SharePoint column each value lands in. To translate the value itself — for example when eDocs stores codes or abbreviations that should become human-readable text in SharePoint — use SettingsCfg.DynamicFieldValueMapping in the SharepointCfg, scoping each mapping with the OpenText. prefix:
OpenText.DocumentType— remap document type codesOpenText.<FieldName>— remap a custom field value, where<FieldName>is the field'sDOCSADM.PROFILEcolumn name — i.e. the value in theFieldNamecolumn of the CustomFields dump sheet (theCOLNAME, which is also the left-hand side of aCustomFieldsentry). UseFieldName, not theLabelcolumn.
A mapping without the OpenText. prefix applies globally to that field name. The mapping supports wildcard matching and an UnknownValue fallback for unmatched values. See Dynamic Name → DynamicFieldValueMapping for the full reference, including the OpenText integration prefix.
# Step 3 — Dump (explore content and map users/groups)
Click Dump to scan the eDocs database and produce an overview Excel file. No documents are migrated. The file is saved to the Migrate\ subdirectory as OpenTextDump_{ConfigName}_{timestamp}.xlsx.
The Excel file contains the following sheets (in order):
| Sheet | Contents | Typical use |
|---|---|---|
| Overview | Database-wide totals (see Overview metrics) | Get a quick picture of the migration scope before drilling into the detail sheets |
| DocumentTypes | TYPE_ID, DESCRIPTION, DISABLED, DocumentCount | Build the DocumentTypeToContentTypes and DocumentTypeToFolders mappings |
| Users | SYSTEM_ID, USER_ID, FULL_NAME, EMAIL_ADDRESS, ALLOW_LOGIN, DISABLED, NETWORK_ID, LAST_LOGIN_DATE, DocumentCount, _MatterCode, _MatterMapping, _M365UserName, _UserMapping | Map eDocs users to Microsoft 365 accounts. DocumentCount shows whether a user is actually used. Fill _M365UserName and copy _UserMapping into ReplaceUserNames (CreatedBy/ModifiedBy + permissions). SYSTEM_ID + _MatterCode/_MatterMapping let you import by user — see Choosing the field to import by. |
| Groups | GROUP_ID, GROUP_NAME, DISABLED, DocumentCount, _M365GroupName, _GroupMapping | Map eDocs security groups to SharePoint/Microsoft 365 groups. DocumentCount shows whether a group is actually used. Fill _M365GroupName and copy _GroupMapping into ReplaceGroupNames (group permissions). |
| Workspaces | WorkspaceId, WorkspaceName, DocumentCount, CreatedBy, CreateDate | Plan workspace-level migration mapping (see Folders and Workspaces) |
| Public Folders | FolderId, FolderName, DocumentCount, CreatedBy, CreateDate | Find folders flagged public in eDocs (see Public Folders) |
| Folders | FolderId, WorkspaceId, Workspace, FolderPath, FolderName, Depth, DocumentCount, RemoteDocumentCount, CreatedBy, CreateDate, Secured | Plan folder-level migration mapping (see Folders and Workspaces) |
| Duplicate Folders | FolderId, FolderName, PlacementCount, Workspace, FolderPath | Spot folders filed in more than one place (see Duplicate folders) |
| Duplicate Document Names | DocumentName, FolderId, FolderName, Workspace, FolderPath, TotalCount, FolderCount | Spot folders with many same-named documents, which slow Import's automatic renaming (see Duplicate document names) |
| CustomFields | FieldName, Label, FieldType, MaxLength, LookupTable from DOCSADM.DOCSCOLUMN | Identify available custom field names to use in CustomFields mapping. Empty if the eDocs database is an older version without custom fields. |
| {LookupTableName} (one sheet per custom lookup or fixed combo field) | All lookup columns + DocumentCount + _MatterCode + _MatterMapping (lookup fields), or Code + Description + _MatterCode + _MatterMapping (fixed combo fields) | Lists all values for each custom field, with how many documents use each value, and the _MatterCode/_MatterMapping helper columns for mapping values to matters. Only appears when the field has a lookup table or a fixed set of values. |
Looking for per-folder migration progress?
Dump's DocumentCount columns are source-side only. For how much of each folder/workspace has actually been migrated (and where errors remain), re-run Report (Step 7) after each migration session — its Folders, Workspaces and Public Folders sheets carry MigratedDocumentCount/MigratedErrorDocumentCount, keyed the same way as here.
User and group mapping
Run Dump before the first Import to get the full user and group list. eDocs USER_ID/GROUP_ID values typically do not match SharePoint login names or group names, so map them in the OpenText configuration: fill the _M365UserName / _M365GroupName column on the Users / Groups sheet, then copy the generated _UserMapping / _GroupMapping column into the ReplaceUserNames / ReplaceGroupNames settings. ReplaceUserNames is applied to the document Author/CreatedBy/ModifiedBy fields and to user permission entries; ReplaceGroupNames to group permission entries. These are OpenText-specific — they replace the use of the shared SettingsCfg.ReplaceUserGroupNames. Use the DocumentCount column to skip users/groups linked to no documents — they do not need mapping.
# Overview metrics
The Overview sheet lists database-wide totals. Every count of documents follows the same rule: non-deleted, distinct documents, regardless of the number of versions (deleted documents — STORAGETYPE = 'D' — are never migrated, so they are excluded everywhere except the explicit Deleted documents metric). A metric shows n/a when its tables or columns are absent on older eDocs schemas.
| Metric | Meaning |
|---|---|
| Total documents | All non-deleted documents |
| Documents with multiple versions | Documents that have more than one version |
| Documents stored in a folder | Non-deleted documents filed in at least one folder |
| Documents in multiple folders | Distinct documents filed in more than one folder (each is still migrated once — see Multi-filed documents) |
| Document shortcuts (secondary folder placements) | Folder placements that are not a document's primary (oldest) placement — the number of .url shortcuts a Shortcuts pass will create (see Multi-filed documents) |
| Documents filed from a remote eDOCS library (not migrated) | Folder placements that point at a document filed in a different eDOCS database — never migrated (see Remote libraries). n/a if your eDocs version has no Remote Libraries support |
| Documents not stored in a folder | Non-deleted documents not filed in any folder |
| Secured documents | Documents with explicit (non-inherited) security |
| Deleted documents | Documents marked deleted — these are not migrated |
| Total workspaces | Top-level containers (PROFILE.ITEM_TYPE = 'W') |
| Non-empty folders | Folders directly containing at least one non-deleted document |
| Empty folders | Folders containing no non-deleted documents |
| Duplicate folders | Folders filed under more than one parent (see Duplicate folders) |
| Secured folders | Folders with explicit (non-inherited) security — the volume migrated when ImportFolderPermissions is enabled |
| Max folder depth | Deepest folder nesting level |
| Total custom fields | User-added / lookup custom fields on DOCSADM.PROFILE |
# Folders and Workspaces
eDocs containers nest as workspace → folder → documents. Workspaces are the top-level containers (PROFILE.ITEM_TYPE = 'W'); their name lives in PROFILE.PATH. A workspace carries no matter code, so to migrate at workspace or folder level you map its identifier to a SharePoint matter code manually (<id>=<mattercode>).
- Folders sheet — one row per folder placement.
FolderIdis the folder's eDocs document number and the key you map and traverse (children link to it via their parent) — it is the value you enter to import a folder.FolderPathis the full path including the folder's own name but excluding the workspace;Workspaceis shown in its own column.DocumentCountis the distinct non-deleted documents directly in that folder that will actually be migrated.RemoteDocumentCountis placements filed from a different eDOCS database in that same folder — never migrated; see Remote libraries. - Workspaces sheet — one row per workspace.
WorkspaceIdis the value you enter to import a workspace.DocumentCountis the distinct non-deleted documents anywhere under the workspace (in any folder of its tree plus any filed directly under it).
Mapping a FolderId (or WorkspaceId) to a matter migrates that folder/workspace and recursively all of its child folders into the same folder structure in SharePoint — see Step 4b.
# Public Folders
eDocs' "Public Folders" view is not a single container — it is a set of folders individually flagged public (DOCSADM.ROOT_OBJECT). Each flagged folder is still an ordinary folder with a real parent elsewhere in the tree; it also just appears as a shortcut in the Public Folders view. It is not included in the Folders sheet's tree (which is built from real parent/child placements only), so the Public Folders sheet lists them separately.
- Public Folders sheet — one row per folder flagged public.
FolderIdis the value you enter to import it, exactly as with any other folder from the Folders sheet — see Step 4b.DocumentCountis the distinct non-deleted documents directly in that folder (not its whole subtree).
If a folder should be migrated, enter its FolderId from this sheet in Folder import mode — its whole subtree is still recreated in SharePoint the same as for any other folder.
# Duplicate folders
A folder can be filed under more than one parent at the same time (it is "multi-filed"). Because it is one folder with one FolderId, it appears once per placement in the Folders sheet — the Duplicate Folders sheet lists exactly these folders so you can see every location at a glance. PlacementCount is how many places the folder is filed.
Folders are migrated once, not once per location
A folder filed under multiple parents is migrated a single time, under each of its real parent locations independently reached during the walk — the duplicate placement is reported for transparency, not migrated repeatedly (a folder already visited in the same run is skipped). For how a document filed in multiple folders is handled, see Multi-filed documents below.
# Duplicate document names
When a target SharePoint folder already contains a document with the same name, Import must ask SharePoint for a free name and append a numeric suffix (1, 2, 3, ...) — a folder with many same-named documents makes that check progressively slower as the folder fills. The Duplicate Document Names sheet lists only names duplicated more than 5 times in the same folder, so you can spot the folders most likely to hit this slowdown before migrating. FolderCount is the duplicate count in that specific folder (what drives the renaming); TotalCount is the name's duplicate count across the whole database, for context. Workspace/FolderPath locate the folder (same tree as the Folders sheet); FolderId cross-references it directly. A document filed straight under a workspace (no folder) shows an empty FolderPath.
eDOCS attachments (a signed PDF or redline attached to a document) are migrated as their own document, named <DOCNAME> (<attachment type>). They land in the same target folder as their parent document, so they are counted here too.
To fix a flagged name instead of just seeing it, add it to the AppendDocNumberToNames setting (see Migrate settings) — Import then appends the eDocs document number before the extension, the same way it already does for email documents. For a flagged attachment row (e.g. Memo (PDF)), configure the base document name (Memo) — it also covers the attachment, which gets its (PDF) suffix back after the appended number.
# Multi-filed documents
A document can also be filed in more than one folder at the same time (independently of the folder-level duplication above). A normal Import migrates that document's real content once — into the folder holding its oldest placement (the placement eDocs created first, tracked internally by DOCSADM.FOLDER_ITEM.SYSTEM_ID). Every other folder it's filed in is left without the file after a normal Import; nothing else about the document (its metadata, versions, or content) differs between placements, since there is only one document.
To also make the document appear — as a link, not a second copy — in its other folders, tick the Shortcuts checkbox next to Import and run Import again for the same matter(s), after the normal import has migrated the real files. This second pass creates a .url shortcut in every non-primary folder, pointing at the real file's SharePoint location. The shortcut carries only the document's name and a link — none of its metadata (author, custom fields, content type) is copied onto it. Shortcuts are not tracked in the _EDMSDocument migration database, so re-running the Shortcuts pass always recreates them (deleting and replacing any that already exist).
Run order: normal import, then Shortcuts last
A shortcut can only be created once the primary placement has a SharePoint target location recorded in _EDMSDocument. Running the Shortcuts pass before the primary placement has been migrated (or while it's still failing) logs an error for that document and skips it. Because shortcuts aren't tracked in _EDMSDocument, run the Shortcuts pass as the last action of a migration — after the normal import and any delta migrations have completed — so it doesn't need to be repeated.
The Documents in multiple folders and Document shortcuts (secondary folder placements) metrics on the Overview sheet show the scope of this before you migrate.
A document's primary placement can be outside the folder/workspace you're importing
A Folder/Workspace import (including a Public Folders entry — it's imported the same way, see Public Folders) only recreates the subtree under the FolderId/WorkspaceId you gave it. If a multi-filed document's primary placement happens to be filed in a folder outside that subtree, this run misses it entirely: it isn't migrated as content (this placement isn't the primary one), and a Shortcuts pass can't fix it either — a shortcut only works once the primary placement has already been migrated with a SharePoint target recorded in _EDMSDocument, and here it never was.
The log records how many documents this happened to after each Folder/Workspace/Public-Folder import run (documents already migrated via a separate batch aren't counted again). To fix them, also import the folder/workspace that actually holds the primary placement — once that's migrated, a Shortcuts pass picks up this folder's placement too. To check beforehand, FolderImportPreview.sql's progress-total query (see SQL scripts) reports a MissingPrimaryDocCount for a given FolderId/WorkspaceId. Field import mode isn't affected — it selects documents by matter field value directly, with no folder subtree to miss.
# Remote libraries
eDocs' "Remote Libraries" feature lets a folder contain documents (or subfolders) that are physically stored in a different eDocs database, not the one this connector is connected to (DOCSADM.FOLDER_ITEM.LIBRARY is non-zero for such a placement; DOCSADM.REMOTE_LIBRARIES lists the other registered databases). Since a document/folder number is only unique within one eDocs database, a remote placement's number can coincidentally also be a real, unrelated document or folder in the connected database.
The connector only ever has a connection to one eDocs database, so it cannot reach the real remote document — these placements are skipped entirely and never migrated, rather than risking the wrong item being imported in their place. If you need the remote document/folder in SharePoint too, migrate it directly from the eDocs database it actually lives in.
This is uncommon — most eDocs deployments only file documents from their own database — but when it happens it is otherwise invisible: the folder in SharePoint simply ends up with fewer documents than eDocs shows, with nothing recorded to explain the gap. To make it visible instead:
- The Overview sheet's Documents filed from a remote eDOCS library (not migrated) metric gives the database-wide total.
- The Folders sheet's
RemoteDocumentCountcolumn shows the count per folder. - During Import, a folder with at least one remote-library placement logs an info-level message naming the folder and the count, whether or not the folder also has local documents to migrate.
Both are n/a/0 on older eDocs versions without Remote Libraries support (no LIBRARY column on DOCSADM.FOLDER_ITEM).
# Choosing the field to import by
MatterField can point at any DOCSADM.PROFILE column — a dedicated matter code column, a lookup or fixed-combo custom field, or a user column (AUTHOR, TYPIST, LAST_EDITED_BY, etc.). Each distinct value of that column maps to a target SharePoint matter, so you can group documents by whichever attribute fits the source data.
The filter matches on the stored value. Lookup and user columns store an integer key (SYSTEM_ID), not the readable label; plain text columns store the text itself. To build the mapping:
- Set
MatterFieldto the column you want to import by, e.g.AUTHORor a custom field. - Run Dump and open the value sheet for that field — the Users sheet for a user column, or the field's own value sheet for a custom field. For each value you want to migrate, type the target SharePoint matter code into the
_MatterCodecolumn. - The
_MatterMappingcolumn then shows the ready-to-use entry — e.g.1234=SmithMatter(stored value=your matter code). Copy the filled_MatterMappingcells straight into the Workspace(s) field (see Step 4 for the full redirect and subfolder syntax).
To land a value's documents in a specific subfolder, append /SubFolderPath to its target matter code — e.g. 1234=SmithMatter/Correspondence. The same _MatterCode/_MatterMapping helper columns appear on every value sheet; lookup and user fields key on the stored SYSTEM_ID, fixed-combo fields key on their Code.
# Step 4 — Initial migration by matter code
The Import mode dropdown selects how documents are selected for migration:
- Field (default) — by a
DOCSADM.PROFILEfield value; covered in this step. RequiresMatterFieldto be set. - Folder / Workspace — by folder or workspace; covered in Step 4b.
Select the OpenText configuration from the OpenText dropdown
Select the database connection from the main window Database dropdown
Select the SharePoint environment from the main window SharePoint Environment dropdown
In the Workspace(s) text box, enter the matter codes to migrate — one per line, or semicolon-separated.
Syntax per entry:
Form Example When to use Matter code only 001234Matter codes are unique across all clients Client + matter code ABC@001234Same matter code exists under different clients; requires ClientMatterSeparatorto be setRedirect: source → target 001234=NEWCODESource matter code differs from the SharePoint matter site identifier Redirect with client codes ABC@001234=XYZ@NEWCODERedirect with both source and target client codes Redirect with subfolder 001234=NEWCODE/CorrespondenceDocuments land in Correspondencesubfolder of the target matter's document libraryMultiple entries:
ABC@001234;ABC@001235or one per line.How the redirect (
=) works:The part before
=identifies the matter in eDocs (used for the SQL query). The part after=is used to look up the matter site in SharePoint. Use this when the eDocs matter code and the SharePoint matter site identifier do not match. If no=is present, the same value is used for both the eDocs query and the SharePoint lookup.Subfolder routing (only available with redirect): append
/SubFolderPathafter the target matter code to place documents in a specific subfolder within the document library. Path separators are/or\. This requires the=redirect syntax — subfolder routing is not available without it.Click Import
The import dialog shows how many matters will be processed. Confirm to start.
What happens during Import:
- The connector creates the
_EDMS*tracking tables if they do not already exist (in the eDocs database, or in MigrationDatabase if configured) - For each matter code, the connector queries the eDocs database for documents belonging to that matter. The query automatically excludes documents that were already successfully migrated and have not changed since — a document is included only if it has no entry in
_EDMSDocument, has an error (retry), or itsLASTEDITDATEin eDocs is newer than theSourceLastModifiedrecorded in_EDMSDocument(modified since last run). WhenTrackChangesInDocumentProfileis enabled, a profile/metadata edit (a newerLAST_PRF_EDIT_DATE) also counts as a change - Each document is uploaded to the corresponding SharePoint document library — via CSOM, or via the Azure Blob pipeline when
UseAzureBlobStorageis enabled — with metadata applied according to the configured column mappings - If
ImportDocumentPermissionsis enabled, document-level permissions are read from eDocs and applied in SharePoint on the CSOM upload path only. The Azure Blob manifest does not carry document permissions, so Import blocks whenImportDocumentPermissionsandUseAzureBlobStorageare both enabled — on Azure Blob, migrate without document permissions and apply them afterwards from the Permissions export. (Folder permissions in Folder/Workspace mode are applied via CSOM and work regardless of upload method.) - Each processed document version is recorded in
_EDMSDocumentwith its SharePoint target location and any error
The progress bar in the main window shows per-matter progress. Errors are logged and recorded in _EDMSDocument.Error.
Matter site must exist
The SharePoint matter site and document libraries must already exist before running Import. If the matter is not found in the SharePoint MatterList, the import for that matter fails with "Matter not found in MatterList".
# eDOCS attachments
eDocs DM supports "attachments" on a document — a companion file such as a signed PDF or a redline from a document comparison product, stored alongside the document's versions (DOCSADM.VERSIONS.VERSION = 0) rather than as one of its numbered versions.
An attachment is migrated as its own SharePoint document, uploaded into the same folder as its parent and named <parent document's DOCNAME> (<attachment type>).<attachment's own extension> — the same {DOCNAME}.{extension} naming used for every regular document, with (<attachment type>) inserted before the extension. DOCNAME is document-level (the same for every version of a document, and for its attachments) — there is no separate, per-attachment display name in eDocs, only the attachment type held in VERSION_LABEL. For example, a document named Deal Contract with a PDF attachment produces a second file named Deal Contract (PDF).pdf. The extension always comes from VERSION_LABEL, not from the attachment's physical storage file — eDocs names an attachment's stored file after the parent document's own application (e.g. .doc for an MS WORD document) regardless of what the attachment actually is, so VERSION_LABEL is the reliable source for its real type. It is tracked in _EDMSDocument under the parent's document number with its own distinct version marker, so re-running Import updates it in place rather than creating duplicates. Attachments are picked up automatically in both Field mode and Folder/Workspace mode — there is no setting to enable or disable this.
eDocs also generates its own internal preview attachment on some documents (VERSION_LABEL = 'PR1') — this is not a real attachment type and is never migrated; it does not appear in Dump, the Migration report, or FolderImportPreview.sql/DuplicateDocumentNames.sql counts.
# Step 4b — Folder and Workspace migration
Instead of selecting documents by a field value, you can migrate a whole eDocs folder or workspace subtree, recreating its folder structure in SharePoint. Choose Folder or Workspace in the Import mode dropdown.
- Run Dump and open the Folders or Workspaces sheet.
- In the Workspace(s) text box, enter the
FolderId(Folder mode) orWorkspaceId(Workspace mode) of each item to migrate — one per line, or semicolon-separated. These are eDocs document numbers, not matter codes. - Because a workspace carries no matter code, route each one to its SharePoint matter with the redirect syntax:
<FolderId>=<mattercode>— and optionally a subfolder,<FolderId>=<mattercode>/<subfolder>. The same=redirect and/subfolderrules as Step 4 apply; the part before=is the folder/workspace to import, the part after=is the SharePoint target. - Click Import. The start prompt states whether folder-permission import is on (see
ImportFolderPermissions).
What happens:
- The folder (or workspace root) and all of its child folders are recreated under the target matter; each folder's documents are uploaded into the matching SharePoint subfolder. Document upload, metadata, delta tracking and
ImportDocumentPermissionsbehave exactly as in Field mode. - The folder's own name is not prepended to the target path — its contents land under the target matter (and the
/subfolderyou specified, if any), with child folders nested below. Use the/subfolderredirect to place the tree under a specific folder. - If
ImportFolderPermissionsis enabled, each created folder receives the eDocs folder's ACLs (mapped through thePermission…ToRoleDefinitionsettings); otherwise folders inherit from their parent. - If
CreateEmptyDirectoriesis enabled, folders with no documents are still created.
Each folder is migrated once
If you enter several folders/workspaces and one is already contained within another you entered (directly or as a nested subfolder), it is migrated once, under the highest selected ancestor. A folder filed under multiple parents (a duplicate folder) is likewise imported only once per run. Skipped duplicates are logged.
# Step 5 — Delta migration
Subsequent Import runs automatically use delta mode when the _EDMSDocument table already contains records.
How delta works:
- On startup, Import checks whether
_EDMSDocumenthas any rows - If rows exist, a dialog asks: Make a backup of the current delta/log table?
- Yes — copies the current table to
_EDMSDocument_{yyyyMMdd_HHmmss}before continuing - No — continues without backup
- Cancel — aborts the import
- Yes — copies the current table to
- Documents already migrated successfully are skipped — only new or changed documents are uploaded. The delta check is done at the SQL level: a document version is re-queued only if it has no entry in
_EDMSDocument, has a recorded error (retry), or itsLASTEDITDATEin eDocs is newer than theSourceLastModifiedrecorded in_EDMSDocument. WhenTrackChangesInDocumentProfileis enabled, a profile/metadata edit (a newerLAST_PRF_EDIT_DATE) also re-queues the document
Starting fresh (removing delta):
Click Remove to reset the migration state. A confirmation dialog is shown: "Clean the previous import? The current content is copied to a new table. Continue?" On confirm, if the table contains records, its contents are automatically copied to a timestamped backup table (_EDMSDocument_{yyyyMMdd_HHmmss}), then the table is truncated. The next Import run will treat all matters as a fresh migration.
When to use Remove
Use Remove when you want to re-migrate all documents from scratch — for example, after a test migration before going live, or when the SharePoint target has been recreated.
# Step 6 — Permissions
Click Permissions to export document- and folder-level permission assignments from eDocs to an Excel file.
Performance impact of document-level permissions
A large number of documents with unique permissions significantly degrades SharePoint performance — each uniquely secured item breaks permission inheritance and increases the load on SharePoint's security model.
Before deciding to migrate permissions, check the Overview sheet from the Dump output: it shows Secured documents (documents with custom permissions) against Total documents. If the ratio is high, discuss with the client whether document-level security needs to be migrated at all. In many cases, applying permissions at the document library or folder level (via the SharePoint provisioning configuration) provides adequate access control with much better performance. Only migrate document-level permissions when the business genuinely requires per-document security.
If you do proceed, run Permissions after migration to get the full per-document permission export for import into SharePoint.
On click, a prompt asks which objects to include:
- Yes — only objects already migrated to SharePoint (those with a target
Urlin_EDMSDocument). Use this to produce a file ready to import. - No — every object with explicit security in eDocs, migrated or not. Migrated rows get their
Urland client/matter filled; the rest are left empty (useful as a full pre-migration security overview). On a database with many secured objects this is larger and slower.
Prerequisites:
- Only objects with non-inherited (explicit) security in eDocs are included
- The target
Url(and client/matter) is filled from_EDMSDocumentfor migrated objects; run the dump after migration (or re-run it) to obtain the target URLs needed for import
Output files: two workbooks in Migrate\, one per object type:
OpenTextFilePermissionSet{ConfigName}_{timestamp}.xlsx— document permissions (FilePermissions)OpenTextFolderPermissionSet{ConfigName}_{timestamp}.xlsx— folder permissions (FolderPermissions)
They are separate files (not two sheets in one) because the Permission Set file handler imports only a workbook's first sheet — each file is therefore independently importable.
FilePermissions columns:
| Column | Description |
|---|---|
__ClientCode | Target SharePoint client code (derived from the matter the document was migrated under, not the eDocs PROFILE.MATTER hierarchy) |
__MatterCode | Target SharePoint matter code (derived from the matter the document was migrated under) |
__DocumentNumber | eDocs document number |
Url | Target SharePoint URL (from _EDMSDocument); empty when the document has not been migrated yet |
DisableInheritance | Always True — breaks permission inheritance on the document |
RemovePermissions | Always True — removes existing permissions before applying the new set |
DomainMembers.{RoleName} | Semicolon-separated domain accounts for this role (one column per role) |
Groups.{RoleName} | Semicolon-separated group names for this role (one column per role) |
The role names ({RoleName}) correspond to the SharePoint role definitions configured in the migration settings (PermissionReadToRoleDefinition, etc.).
FolderPermissions columns: the same as FilePermissions, except __DocumentNumber is replaced by __FolderId (the eDocs folder document number) and Url is the target SharePoint folder URL. It lists the migrated folders that carry explicit security in eDocs. Each folder's URL is reconstructed from where its documents were migrated, so a folder appears only if at least one of its documents was migrated and the folder has explicit security. This file is useful when folder ACLs were not applied during import (ImportFolderPermissions off) and you want to apply them afterwards.
# Applying the export
Each file is applied through site provisioning with the Permission Set file handler, which reads every row and sets the permissions on the target object (by Url). Both file names contain PermissionSet, the name match the handler requires, so each can be run independently. Review and adjust the role columns first, then run them as part of the provisioning configuration. Rows with an empty Url (items not yet migrated) cannot be applied — migrate first, then re-export to obtain their target URLs.
# Step 7 — Migration report
Click Report to export the contents of the _EDMSDocument tracking table to Excel. The file is saved to the Migrate\ subdirectory.
Customized report, not the shared default
Most connectors use the same generic report described in Migration database report. OpenText uses its own version instead (different sheets, shown below), so it can group by the target client/matter the same way Import resolves it — see Choosing the field to import by.
The report is intended as a delivery document for the customer — it provides a clear overview of what was migrated, how many documents were processed per matter, and whether any errors remain. Use it at the end of each migration phase and as sign-off evidence when the migration is complete.
The report is grouped by the matter each document was migrated under (the value entered in the Workspace(s) field, recorded per document). The target SharePoint client/matter columns are derived from that value the same way the import resolves them — so the report is correct regardless of how the documents were selected from the source (by field, folder or workspace). It does not re-read the eDocs PROFILE.MATTER/CLIENT hierarchy. For how many documents exist in the source, use the Dump (its DocumentCount columns).
Output file: OpenTextMigrate_{ConfigName}_{timestamp}.xlsx
Sheets:
| Sheet | Contents |
|---|---|
| Migration | One row per migrated-under matter: target ClientCode/MatterCode, the raw MigrateSource value, migrated document-version count, and error count |
| Error Matters | Matters that have at least one document with an error |
| Error Documents | Individual failed document versions: target client/matter, MigrateSource, source document number and version, target URL, and the error message |
| Folders | Folder-level migration progress: FolderId, Workspace, FolderPath, DocumentCount, MigratedDocumentCount, MigratedErrorDocumentCount — only folders with at least one migrated or errored document are listed |
| Workspaces | Workspace-level migration progress: WorkspaceId, WorkspaceName, DocumentCount, MigratedDocumentCount, MigratedErrorDocumentCount — only workspaces with at least one migrated or errored document are listed |
| Public Folders | Public-folder migration progress: FolderId, FolderName, DocumentCount, MigratedDocumentCount, MigratedErrorDocumentCount — only folders with at least one migrated or errored document are listed |
Per-folder/workspace progress
Unlike Migration (grouped by the matter documents were migrated under), the Folders/Workspaces/Public Folders sheets are grouped by the actual eDocs folder/workspace node — useful in Folder/Workspace import mode, where one matter can span many folders and the Migration sheet alone can't show which specific folder still has failures. FolderId/WorkspaceId cross-reference the same-named columns on Dump's own Folders/Workspaces/Public Folders sheets (Step 3) for the full source-side tree and path. These three sheets only list folders/workspaces touched since the last report, keeping the report proportional to what actually happened rather than the whole source tree.
Run the Report after each migration session to track progress and identify outstanding errors before sign-off.
# The _EDMSDocument tracking table
The connector creates and maintains this standard migration table (shared with the iManage connector) in the dbo schema — in the eDocs database, or in MigrationDatabase if configured. It replaces the older OpenText-specific _ToDMSforLegal table.
| Column | Type | Description |
|---|---|---|
ID | int (identity) | Primary key |
SharepointFileId | varchar(50) | SharePoint file identifier (set by the Azure pipeline) |
MigrateSource | nvarchar | The client/matter code entry the document was migrated under |
Source | nvarchar | eDocs document number |
SourceVersion | varchar | eDocs version label |
SourceLastModified | datetime | Source modified date at time of migration (used for delta detection) |
TargetDocLib | nvarchar | Target document library server-relative URL |
TargetFolder | nvarchar | Target folder within the document library |
TargetFileName | nvarchar | File name in SharePoint after upload |
TargetDocumentNumber | varchar | SharePoint document ID after upload |
TargetDocumentVersion | varchar | SharePoint version after upload |
Error | varchar | Error message if the document failed; empty if successful |
Modified | datetime | When the row was last updated |
Created | datetime | When the row was first created |
The full target URL shown in the File Permissions export and report is composed from TargetDocLib + TargetFolder + TargetFileName.
# Configuration file location
OpenText configurations are saved as JSON files in:
[Epona.Migrate.exe directory]\Config\OpenText\{Name}.json
Each named configuration is a separate file. Renaming a configuration (changing the Name field) renames the file and deletes the old one.
# General migration settings (SharepointCfg)
The SettingsCfg.Migrate section of the SharepointCfg controls migration behaviour shared across all connectors. The settings below are relevant to OpenText migrations.
| Setting | Description |
|---|---|
UseAzureBlobStorage | When true, documents are uploaded through the Azure Blob pipeline instead of direct CSOM. Default false (direct CSOM). |
CleanupOffice2003Documents | Strip doc properties from .doc/.xls/.ppt/.msg files before upload. Useful when old Office files have sensitive internal properties. |
CleanupOffice2007Documents | Strip doc properties from .docx/.xlsx/.pptx files before upload |
ForceEmailInAutoFilingFolder | Always route emails to the AutoFiling folder regardless of matter |
ForceEmailContentType | Override content type for all email documents |
See the migration overview for the full settings reference.
# Migrating from a database copy (production isolation)
When write access to the production eDocs database is not permitted, run the migration against a restored copy on a separate server. This also prevents the migration workload from impacting production performance.
Recommended: keep tracking in a separate MigrationDatabase
Set MigrationDatabase on the database connection (see Separate migration database) to a dedicated database that you do not overwrite between restores. The _EDMS* tracking tables then live outside the eDocs copy, so you can restore a fresh copy of the production database for each delta run without losing migration progress — no row-copying step is needed. The connector creates the _EDMS* tables automatically on the first run.
# Initial migration
- Restore the production eDocs database to a separate SQL Server instance
- (Optional) Create an empty MigrationDatabase on the same server and set it on the connection
- Configure the migration tool connection to point to the restored copy
- Run the migration as normal (see Steps 1–7) — the
_EDMS*tracking tables are created automatically
# Delta migrations
For each subsequent delta run, restore a fresh copy of the production database. If you use a separate MigrationDatabase (recommended), just point the connection at the new copy and run — the tracking data is preserved automatically.
If instead the tracking tables live inside the eDocs copy, do not overwrite the previous copy, as it still holds the _EDMSDocument tracking data:
Restore the latest production backup to a new database name (e.g.,
DOCSADM_2026_05_07)Copy the tracking rows from the previous copy into the new database (the
_EDMSDocumenttable is created automatically on the first run, or pre-create it; theIDcolumn is an identity and is intentionally excluded):INSERT INTO [dbo].[_EDMSDocument] (SharepointFileId, MigrateSource, Source, SourceVersion, SourceLastModified, TargetDocLib, TargetFolder, TargetFileName, TargetDocumentNumber, TargetDocumentVersion, Error, Modified, Created) SELECT SharepointFileId, MigrateSource, Source, SourceVersion, SourceLastModified, TargetDocLib, TargetFolder, TargetFileName, TargetDocumentNumber, TargetDocumentVersion, Error, Modified, Created FROM [PreviousCopyDatabaseName].[dbo].[_EDMSDocument];Replace
PreviousCopyDatabaseNamewith the actual name of the previous database copy. The delta logic keys onSource(document number) andSourceVersion, notID.Update the migration tool connection to point to the new database copy
Run the delta migration as normal — the connector will skip documents already recorded in
_EDMSDocumentand process only new or changed ones
# SQL scripts
The deployment zip includes the following SQL scripts in the sql\ folder. Run them directly in SQL Server Management Studio against the eDocs database for diagnostics or pre-setup.
Pre-creating the tracking tables
The connector creates the _EDMS* tracking tables automatically on the first run. If the migration
account lacks CREATE TABLE rights, a DBA can pre-create them: the migrator writes the exact creation
script to MigrateDb\CreateMigrationTablesSqlServer.sql (next to Epona.Migrate.exe) on every startup
— run that script against the database that holds the tracking tables (the eDocs database, or the
separate MigrationDatabase).
| Script | Purpose |
|---|---|
DumpContent.sql | Generic source overview for SSMS: overview totals (documents, deleted, secured, workspaces), document types, users and groups (all with document counts and SYSTEM_ID), custom fields, and folders (with full path and per-folder document count). Uses the same counting logic as the Dump button. The folders section needs ufnFolderPath.sql installed first. The Dump button produces the full, authoritative breakdown (folder/workspace sheets and custom-field value sheets with matter-mapping helper columns); use this script only for a quick look. |
PendingDocuments.sql | Shows the document versions still pending migration (the delta filter against _EDMSDocument), across all documents. Add your own WHERE on the relevant DOCSADM.PROFILE column to narrow it to a matter. Use this to verify which documents will be picked up (or skipped) before running Import. |
ufnFolderPath.sql | Creates the dbo.ufn_FolderPath(@profileID) function (CREATE OR ALTER) that resolves a document's or folder's path by traversing the DOCSADM.FOLDER_ITEM parent chain, returning a /-separated path. Install with a DBA account against the eDocs database — required by the folders section of DumpContent.sql. |
FolderImportPreview.sql | Previews exactly what a Folder/Workspace import run will select for a given FolderId/WorkspaceId (Step 4b) — subfolder tree, documents, and attachments, with the same delta filter against _EDMSDocument the real Import uses. Also reports MissingPrimaryDocCount — documents this run would silently miss because their primary placement is outside the imported subtree, see the warning under Multi-filed documents. Set @FolderDocNumber and run against the eDocs database (or a copy) to sanity-check the selection before running a real import. |
# Troubleshooting
# Cannot connect to the eDocs database
- Cause: SQL Server connection string is incorrect, server is unreachable, or the login lacks permissions
- Resolution: Verify the connection string in Create/Edit Database; test connectivity with SQL Server Management Studio; ensure the login has
db_datareaderonDOCSADMschema and rights to create and write the_EDMS*tables on thedboschema (in the eDocs database, or in MigrationDatabase if configured)
# "Specify one or more (client)mattercodes"
- Cause: The Workspace(s) text box is empty
- Resolution: Enter at least one matter code before clicking Import
# "Matter not found in MatterList"
- Cause: The matter code does not match any site in the SharePoint MatterList, or the
ClientMatterSeparatoris configured incorrectly - Resolution: Verify the matter code format in the Dump output (the value sheet for your
MatterField— e.g. its lookup-table sheet); check whether client and matter codes need to be combined usingCombineClientAndMatterCodeToMatterCode; confirm the target matter site exists in SharePoint
# Import processes fewer matters than expected
- Cause: Matters that have zero documents in eDocs are silently skipped — they consume a line in the text box but produce no import activity and are not counted in the progress.
- Resolution: Run Dump and check the value sheet for your
MatterField(its lookup-table sheet). TheDocumentCountcolumn shows how many documents each value has. Values withDocumentCount = 0will be skipped even if their code is listed in the Workspace(s) text box.
# Zero documents migrated for a matter
- Cause: The matter has no documents in eDocs that match the query (documents in folder workspaces are handled differently from top-level documents), or all documents were already migrated (delta mode)
- Resolution: Check the value sheet for your
MatterFieldfrom the Dump — verifyDocumentCount> 0; if doing a fresh migration, use Remove to clear the delta table
# A version permanently failed (zero-byte or missing file) — recovering after it's fixed in eDocs
- Cause: A version's source file was zero bytes or missing on disk (
_EDMSDocument.Error:Zero byte documentorFile not found or FileStream is empty). This never resolves itself on retry, so Import skips only that one version and keeps migrating the document's later versions, including the latest — the delta filter also stops re-attempting that specific version once it's recorded with this error, so it won't slow down every future run either. - Resolution: Once the source file has been repaired in eDocs (a new file checked in for that version), do not just re-run Import expecting the fixed version to slot back into its correct place — SharePoint can only add a new version at the end of a document's history, so a version fixed after later ones already migrated would arrive out of order (its older content would show up as the newest version). Recover cleanly instead:
- Check the document's version history in SharePoint first — a migrated version's Modified date is restored from eDocs (the original edit date), so it's always older than when the migration actually ran. Compare the most recent version's Modified date against
_EDMSDocument.Modified(the bookkeeping timestamp of the last successfully-migrated row for this document — updated to the current time every time Import touches it). If the SharePoint version is newer than that, someone edited the document directly in SharePoint after migration — stop, that content isn't in eDocs and will be lost if the document is deleted. Save/export that version's content separately before doing anything else, and only continue once it's no longer at risk (or handle this document manually instead of via re-import). - Once you've confirmed there's nothing to lose, delete the document entirely in SharePoint (whatever version history migrated so far).
- Delete every
_EDMSDocumentrow for that document (delete from _EDMSDocument where Source = '<DOCNUMBER>'), clearing its partial history so the connector treats the whole document as unmigrated. - Re-run Import for that matter/folder — every version, now including the fixed one, migrates in order into a fresh SharePoint file.
- Check the document's version history in SharePoint first — a migrated version's Modified date is restored from eDocs (the original edit date), so it's always older than when the migration actually ran. Compare the most recent version's Modified date against
# Document metadata is wrong (wrong author, date, type)
- Cause:
Author,DocumentNumber,DocumentTypemetadata settings do not match the actual SharePoint column names, or the target columns do not exist on the content type - Resolution: Verify SharePoint column internal names match the values set in the OpenText configuration (Metadata section)
# Permissions not applied after migration
- Cause:
ImportDocumentPermissionsisfalse, or theUSER_ID/GROUP_IDvalues from eDocs are not mapped to valid SharePoint login names or group names - Resolution: Enable
ImportDocumentPermissions; use the Users and Groups sheets from the Dump output to build the OpenTextReplaceUserNamesandReplaceGroupNamesmappings (fill_M365UserName/_M365GroupName, copy the_UserMapping/_GroupMappingcolumns). The connector keys onUSER_IDandGROUP_ID— each must map to the corresponding SharePoint login name (UPN) or group name. Format:USER_ID=user@domain.com;andGROUP_ID=SharePoint Group Name;
# Content type not found
- Cause: A document type in
DocumentTypeToContentTypesmaps to a content type name that does not exist on the target SharePoint document library - Resolution: Verify content type names exactly (case-sensitive); ensure the content type is added to the document library on the target matter site
# Custom field values not written to SharePoint
- Cause: The field name in
CustomFieldsdoes not match the column name inDOCSADM.PROFILE, or the SharePoint column internal name is incorrect - Resolution: Run Dump and check the CustomFields sheet — use
FIELD_NAMEexactly as it appears there. Verify the SharePoint column internal name is correct (internal names are case-sensitive and may differ from the display name). If the CustomFields sheet is empty, the eDocs database is an older version without custom fields — theCustomFieldssetting has no effect.
# CustomFields sheet is empty after Dump
- Cause: The eDocs database is an older version that does not have the
DOCSADM.ATTRIBUTEtable. This is expected and backwards compatible — the migration continues normally without custom fields. - Resolution: No action needed. If custom fields are required and the source database is old, confirm with the client whether custom fields exist.
# Related
- Migration overview — how the migration system works
- Migration database report — the shared default report used by most connectors; OpenText uses its own customized version (see Step 7)