By default Acumatica stores uploaded files — attachments, generated reports, imported documents — as rows in the database. Move a busy tenant's attachments to Azure Blob Storage and the database gets smaller, backups get faster, and file storage becomes something you can scale independently. Acumatica supports this natively through its file storage provider mechanism; there is no custom code required for the standard case.
Why move files out of the database
Storing binaries in SQL Server is convenient — one backup covers everything, transactional consistency is free — but it does not age well. Attachments are usually the largest and fastest-growing part of an ERP database, and every one of those bytes rides along in every full backup, every restore, and every copy to a test environment. Moving files to blob storage keeps the database focused on relational data, shrinks backup windows dramatically, and lets you apply cheaper storage tiers to files that are rarely read.
Files in blob storage are no longer inside the database transaction or the database backup. Your recovery plan now has two moving parts — the database and the blob container — and they must be restored to consistent points in time. This is manageable, but it is a real change to your DR story, not a free win.
How the file storage provider works
Acumatica abstracts file storage behind a provider. Out of the box it ships a database provider and cloud providers including Azure Blob Storage. You configure the provider, and thereafter every UploadFile that flows through the framework is written to blob storage instead of the UploadFileRevision table. Crucially, the file metadata (name, note references, which record it is attached to) stays in the database — only the binary content moves. That means all the existing attachment UI keeps working unchanged; users never see where the bytes actually live.
Configuring the Azure side
On Azure, create a storage account and a private blob container dedicated to Acumatica. Keep the container private — these are business documents, and public access is never appropriate. Grab the connection string (or, better, use a managed identity / shared access signature depending on your security posture). A few Azure-side choices matter:
- Redundancy: at minimum zone-redundant; geo-redundant if your DR plan needs cross-region durability.
- Access tier: Hot for actively used attachments. Lifecycle rules can shift old blobs to Cool, but be careful moving anything to Archive — Archive retrieval is slow and will make an attachment appear to hang when a user opens it.
- Region: put the container in the same region as the Acumatica instance to keep latency low, since every file open is now a network round trip.
File Storage Preferences / Provider config:
Provider : Azure Blob Storage
Connection string : DefaultEndpointsProtocol=https;AccountName=...;
AccountKey=...;EndpointSuffix=core.windows.net
Container : acumatica-attachments (private access)
Scope: choose which files use the provider
- new uploads only, or
- migrate existing UploadFileRevision rows via the move process
Migrating existing files
Switching the provider only changes where new files go. Existing attachments already sitting in the database do not move by themselves — Acumatica provides a process to relocate them from the database provider to blob storage. Run it in batches, outside business hours, and verify a sample of migrated files opens correctly before you consider the migration complete. Do not delete the database copies until you have confirmed the blob copies are readable; a migration that reports success but leaves unreadable blobs is the worst-case outcome.
After migrating, run a real disaster-recovery drill: restore the database to a point in time and confirm the attachments (now in Azure) still resolve. If the blob container and the database drift apart, users get broken attachment links with no obvious cause. Snapshot or version the container so you can restore it to match a database restore point.
Operational considerations
Once files live in Azure, a few things change day to day. File access adds network latency, so a slow or throttled storage account shows up as slow attachment opens — monitor the storage account's metrics, not just the app server. Costs move from database storage to blob storage plus egress; egress is usually small for internal use but worth watching if you serve large documents to external portals. And security now spans two systems: the container's access keys are as sensitive as a database credential, so rotate them, store them in a secret store rather than plaintext config where possible, and keep the container private.
| Concern | Database storage | Azure Blob Storage |
|---|---|---|
| Backup size | Large — files included | Small — files excluded |
| Scaling | Tied to DB tier | Independent, cheap |
| Consistency | Transactional, one backup | Two systems to keep in sync |
| File open latency | Local DB read | Network round trip |
| Cost profile | Premium DB storage | Tiered blob + egress |
Wrapping up
Offloading Acumatica attachments to Azure Blob Storage is one of the higher-value infrastructure changes available without custom code: smaller database, faster backups, independent scaling. The catch is that it splits your data across two systems, so the work that matters is not the configuration screen — it is the migration verification and the DR drill that proves database and blobs restore together. Get those right and this is a change you set once and stop thinking about.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.