What is TAAS
Table as a service is a very convenient way of high frequency, high volume data exchange, operations, without the need of worrying about the supporting architecture, speed and efficiency. I can make my data be stored and arranged as per any need, without sticking to a fixed metadata, beforehand – as compared to conventional DBMS definition. Your Table exists as an API, whereby you can call the API and enforcing PUT, POST and delete actions thereby.Table as a service as a storage
Azure table storage exists as a patterned NoSql data in Azure, resulting in a schema-less design.Table storage generally comprises of following components:
Accounts: a subscription account that connects all the storage offerings(Blobs/files, queues, containers, tables)
Tables: a table can comprise of several entities
Entities: an entity is like a row that comprises of several properties
Properties: Key-value pair
Look at the following example, that comes from a TAAS on a successful creation:
<content type = “application/xml”>
<m:properties>
<d:PartitionKey>RecId</d:PartitionKey>
<d:RowKey>2121212313</d:RowKey>
<d:TimeStamp m:Type=”Edm.DateTime”>2019-12-22T06:06:06.673110727</d:TimeStamp>
<d:AcqMethod>Test3</d:acqMethod>
<d:Description>Test desc</d:Description>
<m:properties>
</content>
The above example results from an attempt to write into a table, with fields AcqMethod and Description. PartitionKey and RowKey are evidently unqiue key pair. Here the record exists as a property (starting from <d:PartitionKey> to <d:Description>). The table does not have any fixed schema as contrary to our concept of RDBMS.
Creating a table storage
Step 1:
Navigate to ~\Home\All services\Storage accounts\admin storage account. Choose from ‘Tables’.Step 2:
Create a new table à give a table name(avoid using ‘_’ or special characters). Press OK to to continue.This would result in creating your table. See the adjoining URL, implying that it exists as an endpoint API.
Step3:
Shared access signature (SAS):
A shared access signature is an easy way common palette of data access for various modes of data storages: Blob, Queues, tables or containers.Navigate to left hand pane à Shared access signature à Generate SAS and Connection string button. Tick on ‘Table’ à to create Keys for Table. Also click on the necessary allowed permissions:
This will generate the following access key/connection strings:
Querying your table from Postman:
Copy the ‘Table service SAS URL’ à Open postman à paste it in the browser à amend to include the table name you have created between ? and the last ‘\’ à do a ‘GET’ à SendIt will result in the records of the table as an XML’s key value pair dataset:
Note: how the name of the table has been given at the end of the SAS key.
Viewing from Azure browser
You can download Azure browser from:https://go.microsoft.com/fwlink/?LinkId=708343&clcid=0x4009
You can install the storage explorer. It’s an ultimate tool to upload, download, maintain and query your storage contents – just like the older days of SSMS.
Browse down to à on the left hand pane Subscription name à Storage accounts à created table:
You can query quite easily using query button from above:
Using logic apps: integration
Logic apps could be used successfully as a messenger exposing your Table Services to expose, interpret/Parse and consume data. You can expose your table as a service and then write a trigger to be fired when the data comes to your table as a HTTP request.Steps:
a. Figure out an HTTP request with the following JSON payload as its sample payload:
{
“PartitionKey”: “RecId”
“RowKey”: 122121212121,
“Acqmethod”: “Test1”,
“Description”: “Test1 desc”
}
b. You can optionally choose a ‘compose’ action from above result.
c. Add an action as ‘Insert entity’ by choosing from ‘Table storage’ connecter.
d. Choose from step-b, choose from the Table that you have created (evidently it relates the set of tables available from the same azure subscription.
e. Add a ‘Get entity’ action à it acts like an query, select the table you created and ‘PartitionKey’ and ‘RowKey’ values from the payload defined on Step-a.
So as a result the code for the logic app looks like:
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Compose": {
"inputs": "@triggerOutputs()['queries']",
"runAfter": {},
"type": "Compose"
},
"Get_entity": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['azuretables']['connectionId']"
}
},
"method": "get",
"path": "/Tables/@{encodeURIComponent('_Table_Name_')}/entities(PartitionKey='@{encodeURIComponent(triggerBody()?['PartitionKey'])}',RowKey='@{encodeURIComponent(triggerBody()?['RowKey'])}')"
},
"runAfter": {
"Insert_Entity": [
"Succeeded"
]
},
"type": "ApiConnection"
},
"Insert_Entity": {
"inputs": {
"body": "@outputs('Compose')",
"host": {
"connection": {
"name": "@parameters('$connections')['azuretables']['connectionId']"
}
},
"method": "post",
"path": "/Tables/@{encodeURIComponent('_Table_Name_')}/entities"
},
"runAfter": {
"Compose": [
"Succeeded"
]
},
"type": "ApiConnection"
},
"Post_a_message_(V3)": {
"inputs": {
"body": {
"body": {
"content": "<p>@{outputs('Compose')}</p>",
"contentType": "html"
}
},
"host": {
"connection": {
"name": "@parameters('$connections')['teams']['connectionId']"
}
},
"method": "post",
"path": "/v3/beta/teams/@{encodeURIComponent('*****')}/channels/@{encodeURIComponent('***@thread.skype')}/messages"
},
"runAfter": {
"Get_entity": [
"Succeeded"
]
},
"type": "ApiConnection"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"manual": {
"inputs": {
"schema": {
"properties": {
"AcqMethod": {
"type": "string"
},
"Description": {
"type": "string"
},
"PartitionKey": {
"type": "string"
},
"RowKey": {
"type": "string"
}
},
"type": "object"
}
},
"kind": "Http",
"type": "Request"
}
}
},
"parameters": {
"$connections": {
"value": {
"azuretables": {
"connectionId": "/subscriptions/****/resourceGroups/****/providers/Microsoft.Web/connections/azuretables",
"connectionName": "azuretables",
"id": "/subscriptions/*****/providers/Microsoft.Web/locations/westus/managedApis/azuretables"
},
"teams": {
"connectionId": "/subscriptions/****/resourceGroups/****/providers/Microsoft.Web/connections/teams-1",
"connectionName": "teams-1",
"id": "/subscriptions/****/providers/Microsoft.Web/locations/westus/managedApis/teams"
}
}
}
}
}
The logic app gives the following outcome, when fired from Postman:
*This post is locked for comments