Table Storage
Azure integration · 14 node(s).
00Overview
Store and retrieve rows in Azure Table Storage straight from a flow — insert, fetch, update, upsert, delete and query entities, and run up to a hundred changes as one all-or-nothing batch, plus create, list and delete the tables themselves. You can also hand out scoped, time-limited access with a shared access signature, manage a table's stored access policies, and read the account's Table service settings for diagnostics. Everything keys off a storage account you already have, using its account key, a connection string or a Microsoft Entra service principal.
Every field below is exactly what you see in the Flomation editor. Fields marked ● live picker let you choose from a list pulled live from your account — no IDs to look up.
01Connecting Table Storage
- In the Azure portal, open your storage account and go to Security + networking → Access keys — this one page has everything the first two authentication methods need.
- For the simplest setup, set Authentication to Shared Key, put the account's name in Storage Account, and copy the Key value (the base64 string, not its name) into Account Key. Alternatively set Authentication to Connection String and paste the whole Connection string from the same page into Connection String — it already carries the account name and key.
- To authenticate as an app instead, set Authentication to Microsoft Entra (service principal). In Microsoft Entra ID → App registrations, register an application, add a secret under Certificates & secrets → Client secrets, then fill Tenant ID (Directory / tenant ID), Client ID (Application / client ID) and Client Secret.
- For the service-principal method, also grant that app access to the data: on the storage account's Access control (IAM) blade, assign it the Storage Table Data Contributor role (or Storage Table Data Reader for read-only) — a subscription-level Owner role is not enough.
- Store the sensitive value — the account key, connection string or client secret — as a Flomation environment secret (e.g.
tables_secret) and select it in the node's matching field.
| Field | Type | Details | |
|---|---|---|---|
| Authentication | string | Shared Key, Connection String, Microsoft Entra (service principal) | |
| Account Key | secret | Base64 account key — Storage Account ▸ Access keys | |
| Connection String | secret | DefaultEndpointsProtocol=https;AccountName=…;AccountKey=…;EndpointSuffix=core.windows.net — Storage Account ▸ Access keys ▸ Connection string | |
| Client Secret | secret | The app needs a Storage Table Data role on the account (RBAC) | |
| Allow Insecure TLS | boolean | Skip TLS verification — only for custom endpoints with a self-signed certificate | |
| Storage Account | string | mystorageaccount | |
| Tenant ID | string | Directory (tenant) ID — a GUID or your-tenant.onmicrosoft.com | |
| Client ID | string | Application (client) ID of the service principal | |
| Custom Endpoint | string | https://myaccount.table.core.windows.net — leave blank to derive; Azurite: http://host:10002/devstoreaccount1 |
${secrets.your_secret}.02Entity
Azure Table Storage: Batch Rows
azure/tables/entity_batch · Action
Apply up to 100 row changes as one all-or-nothing transaction. Every change must be in the SAME partition — that is the service's rule, not ours, and it is what makes the batch atomic
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Changes (JSON array) | object | Required | [{"action":"upsert_merge","row":{"PartitionKey":"orders","RowKey":"1001","Total":42}},{"action":"delete","row":{"PartitionKey":"orders","RowKey":"1002"}}] — every row must share one PartitionKey |
Returns: id, result, tool_result, success, error
Azure Table Storage: Delete Row
azure/tables/entity_delete · Action
Delete one row by Partition Key and Row Key. Supply an ETag to fail if the row changed since you read it
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Partition Key | string | Required | The group the row lives in, e.g. orders — rows sharing one Partition Key are stored together and are the only rows a batch can touch |
| Row Key | string | Required | The row's ID within that group, e.g. 1001 — Partition Key + Row Key together identify exactly one row |
| ETag | string | Optional — take it from a previous action's result.etag to fail if the row changed since. LEAVE BLANK to overwrite whatever is there now | |
| Ignore If It Does Not Exist | boolean | Treat a missing row as success instead of an error |
Returns: id, result, tool_result, success, error
Azure Table Storage: Get Row
azure/tables/entity_get · Action
Fetch one row by Partition Key and Row Key. This is the fast path — the only lookup that goes straight to the row rather than scanning
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Partition Key | string | Required | The group the row lives in, e.g. orders — rows sharing one Partition Key are stored together and are the only rows a batch can touch |
| Row Key | string | Required | The row's ID within that group, e.g. 1001 — Partition Key + Row Key together identify exactly one row |
| Fields | string | Customer,Total — comma-separated; leave blank for every field |
Returns: id, result, tool_result, success, error
Azure Table Storage: Insert Row
azure/tables/entity_insert · Action
Insert a new row. Fails if a row with the same Partition Key and Row Key already exists — this is the strictly-create path; use Upsert Row to insert-or-update
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Row (JSON) | object | Required | {"PartitionKey":"orders","RowKey":"1001","Customer":"Acme","Total":42} — PartitionKey and RowKey are required and must be text. Rows are FLAT: no nested objects or arrays |
Returns: id, result, tool_result, success, error
Azure Table Storage: Query Rows
azure/tables/entity_query · Action
Query rows with an OData filter. Include the Partition Key in the filter wherever you can — only Partition Key and Row Key are indexed, so any other filter scans the whole table and gets slower as it grows
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Filter (OData) | string | PartitionKey eq 'orders' and Total gt 100 — text values go in single quotes, and an apostrophe inside one must be doubled (O''Brien) | |
| Fields | string | Customer,Total — comma-separated; leave blank for every field | |
| Return All | boolean | Follow the continuation to the end instead of returning one page. On an unfiltered table this reads every row | |
| Limit (per page) | integer | 50 unless set — the service caps a page at 1000 rows |
Returns: results, count, tool_result, success, error
Azure Table Storage: Update Row
azure/tables/entity_update · Action
Update a row that must already exist. Merge only changes the fields you supply; Replace DELETES every field you leave out. Supply an ETag to fail if the row changed since you read it
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Row (JSON) | object | Required | {"PartitionKey":"orders","RowKey":"1001","Customer":"Acme","Total":42} — PartitionKey and RowKey are required and must be text. Rows are FLAT: no nested objects or arrays |
| Update Mode | string | choices: Merge — only change the fields you supply, Replace — delete any field you do not supply | |
| ETag | string | Optional — take it from a previous action's result.etag to fail if the row changed since. LEAVE BLANK to overwrite whatever is there now |
Returns: id, result, tool_result, success, error
Azure Table Storage: Upsert Row
azure/tables/entity_upsert · Action
Insert the row, or update it if it already exists. The action most flows want. Merge only changes the fields you supply; Replace DELETES every field you leave out
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Row (JSON) | object | Required | {"PartitionKey":"orders","RowKey":"1001","Customer":"Acme","Total":42} — PartitionKey and RowKey are required and must be text. Rows are FLAT: no nested objects or arrays |
| Update Mode | string | choices: Merge — only change the fields you supply, Replace — delete any field you do not supply |
Returns: id, result, tool_result, success, error
03Service
Azure Table Storage: Get Service Properties
azure/tables/service_get_properties · Action
Read the account-level Table service settings — CORS rules, logging and metrics — and optionally the geo-replication status. Diagnostic; rarely what a flow needs
| Field | Type | Details | |
|---|---|---|---|
| Include Geo-Replication Status | boolean | Only works on a read-access geo-redundant (RA-GRS) account AND only via its -secondary endpoint, e.g. https://myaccount-secondary.table.core.windows.net |
Returns: id, result, tool_result, success, error
04Table
Azure Table Storage: Create Table
azure/tables/table_create · Action
Create a table in the storage account. Optionally succeed quietly when it already exists, so a flow can create-on-first-run without an error branch
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Ignore If It Already Exists | boolean | Treat an existing table as success instead of an error — the create-on-first-run shape |
Returns: id, result, tool_result, success, error
Azure Table Storage: Delete Table
azure/tables/table_delete · Action
Delete a table and every row in it. The name stays unusable for up to about 40 seconds afterwards while the service reclaims it
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Ignore If It Does Not Exist | boolean | Treat a missing table as success instead of an error |
Returns: id, result, tool_result, success, error
Azure Table Storage: Generate SAS Link
azure/tables/table_generate_sas · Action
Create a time-limited shared access signature for one table — hand out access without sharing the account key, optionally narrowed to a slice of rows. Signed locally with the account key; no API call is made
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Permissions | string | r (read) is the default — any subset of "raud": read, add, update, delete | |
| Expires After (hours) | integer | 24 unless set | |
| HTTPS Only | boolean | Refuse the link over plain HTTP. Leave off for an Azurite endpoint, which is HTTP | |
| From Partition Key | string | Optional — limit the link to rows from this partition onwards | |
| From Row Key | string | Optional — only meaningful alongside From Partition Key | |
| To Partition Key | string | Optional — limit the link to rows up to and including this partition | |
| To Row Key | string | Optional — only meaningful alongside To Partition Key |
Returns: id, result, sas_url, sas_token, expires_at, tool_result, success, error
Azure Table Storage: Get Access Policies
azure/tables/table_get_access_policy · Action
Read the stored access policies on a table — the named, revocable grants a SAS link can point at instead of carrying its own permissions
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
Returns: results, count, tool_result, success, error
Azure Table Storage: List Tables
azure/tables/table_get_all · Action
List the tables in the storage account
| Field | Type | Details | |
|---|---|---|---|
| Filter (OData) | string | TableName eq 'MyTable' — leave blank for every table | |
| Return All | boolean | Follow the continuation token to the end instead of returning one page | |
| Limit | integer | 50 unless set — ignored when Return All is on |
Returns: results, count, tool_result, success, error
Azure Table Storage: Set Access Policies
azure/tables/table_set_access_policy · Action
Write the stored access policies on a table. This REPLACES the whole set — any policy you leave out is removed, which instantly revokes every SAS link that referenced it. Send an empty list to clear them all
| Field | Type | Details | |
|---|---|---|---|
| Table | string | Required | MyTable — letters and digits only, starting with a letter |
| Policies (JSON array) | object | Required | [{"id":"readonly","permissions":"r","expiry":"2027-01-01T00:00:00Z"}] — max 5; permissions is any subset of "raud". An empty list [] removes every policy |
Returns: id, result, tool_result, success, error
05Notes & Limitations
Behaviours and constraints worth knowing before you build with these nodes.
- Microsoft Entra service-principal authentication cannot sign a shared access signature, so generating a SAS link requires Shared Key or Connection String authentication instead.
- A service principal needs a data-plane role such as Storage Table Data Contributor (or Storage Table Data Reader for read-only) assigned on the storage account itself, because a subscription-level Owner or Contributor role does not grant access to the table data.
- Rows are flat, so store any nested object or array as a JSON string, and stay within the service limits of 255 properties, 1 MB per row and 32 KB per string property.
- A large whole number can lose precision because an untyped JSON number is stored as a 32-bit integer or a floating-point value; a 64-bit integer must be tagged with an Edm.Int64 type so it round-trips intact.
- Return All follows continuation pages only up to a fixed safety cap, then stops and asks you to narrow the filter, so it is not a guaranteed full export of a very large table.