Microsoft Azure Storage
This page shows how to set up and use the Microsoft Azure Storage destination. The Microsoft Azure Storage destination loads data to a cloud based Azure Storage.
Requirements
The Azure Storage (Blob / Data Lake) destination supports the following Azure storage account types:
- General-purpose V2 (including Azure Data Lake Storage Gen2)
- General-purpose V1
- BlockBlobStorage
- BlobStorage
To use the Azure Storage (Blob / Data Lake) destination you need one of the above Azure storage accounts. For more information, see Microsoft Documentation: Azure storage account overview.
Create a new Microsoft Azure Storage Destination
Follow the steps below to add a new Microsoft Azure Storage destination to Xtract Universal:
- In the main window of the Designer, navigate to Server > Manage Destinations. The window “Manage Destinations” opens.
- Click [Add] to create a new destination. The window "Destination Details" opens.
- Enter a Name for the destination.
- Select the destination type Microsoft Azure Storage from the drop-down menu. A list of connection details opens.
- Fill out the destination details to connect to the destination.
- Click [OK] to confirm your input.
The destination can now be assigned to extractions.
Destination Details
The destination details define the connection to the destination.
Connection Type
The subsection Connection Type offers the following methods for authenticating and authorizing access to Azure storage:
- Access Key
- Entra ID
- Shared Access Signature (SAS)
For information on advantages and disadvantages of the different authentication methods, see Microsoft Documentation: Choosing the right authentication method.
-
Access Key
This method of authentication authorizes access to the complete storage account. For more information, see Microsoft Documentation: Manage storage account access keys.
-
Entra ID
This method of authentication uses OAuth 2.0 and Microsoft Entra ID (formerly Azure Active Directory), see Authentication via Microsoft Entra ID for Azure Storage. Access rights can be granted on storage account or container level.
-
Shared Access Signature (Account)
This method of authentication uses Shared Access Signatures (SAS) to access the complete storage account. For more information, see Microsoft Documentation: Grant limited access to Azure Storage resources using shared access signatures.
-
Shared Access Signature (Container)
This method of authentication uses Shared Access Signatures (SAS) to access a specific storage container. For more information, see Microsoft Documentation: Create SAS tokens for storage containers
Note
The following permissions are required when using Shared Access Signature (SAS):
- Add
- Create
- Write
- Delete
- List
Access Key Parameters / SAS Parameters
The input fields in the subsection Access key parameters / SAS parameters vary depending on the selected connection type.
Storage account
Enter your storage account name. Do not enter the full URL.
Access key
Enter the access key of the Azure Storage account.
Tip
You can copy the storage account name and access key from the Azure Portal.
Connect
Click [Connect] to establish a connection to the storage account. If the connection is successful, a "Connection successful" info window opens.
Storage account
Enter your storage account name.
Tenant ID
Enter the ID of the Azure AD tenant.
Client ID
Enter the ID of the registered app.
Tip
You can copy the tenant ID and client ID in the Azure portal.
Connect
Click [Connect] to establish a connection to the storage account. A browser window pops up, where you have to sign in using your Azure AD credentials. The "Permissions requested" window lists the requested permissions, see Knowledge Base Article: Authentication via Microsoft Entra ID. Click [Accept]. If the connection is successful, a "Connection successful" info window opens.
Storage account
Enter your storage account name. Do not enter the full URL.
SAS token
Enter the SAS token at the Azure Storage container level.
Tip
You can copy the SAS token from the Azure portal (Storage accounts > [account_name] > Security + networking > Shared access signature).
Connect
Click [Connect] to establish a connection to the storage account. If the connection is successful, you can select an existing container from the drop down list Container.
Storage account
Enter your storage account name. Do not enter the full URL.
Container
Enter the name of an existing Azure storage container.
SAS token
Enter the SAS token generated at the Azure Storage container level.
Tip
You can copy the SAS token from the Azure portal (Storage accounts > [account_name] > Data storage > Containers > [account_name] > Generate SAS).
Connect
Click [Connect] to establish a connection to the storage account.
Container
This subsection is activated after a connection to the storage account was successfully established.
- When using Access Key authentication, select a Blob container from the drop-down list.
- When using Entry ID authentication, enter the name of the Blob container manually.
- When using Shared Access Signature (Account) authentication, select a Blob container from the drop-down list.
Test connection
Click [Test Connection] to check if the storage container can be accessed.
If the connection is successful, a "Connection to container <name of container> successful" info window opens.
The Azure Storage (Blob / Data Lake) destination can now be used.
Misc
Note
The settings in Misc can only be used in combination with a Blob container.
Folder path
Creates a folder structure within the container. Script expressions are supported, see Use Script Expressions as Dynamic Folder Paths.
- Create a single folder by entering a folder name without slashes:
[folder]
- Create subfolders using the following syntax:
[folder]/[subfolder_1]/[subfolder_2]/[..]
Note
The specified folder path applies to all extractions. To define a folder path for single extractions, use the Folder option in the Destination Settings.
File Format
Select the required file format. You can choose between CSV, JSON and Parquet.
CVS Settings
The settings for file type CSV correspond to the settings of the Flat File CSV destination:
JSON Settings
To use the JSON file format, no further settings are necessary.
Parquet Settings
The settings for file type Parquet correspond to the settings of the Flat File Parquet destination:
Connection Retry and Rollback
Connection retry is a built-in function of the Microsoft Azure Storage destination. The retry function is activated by default.
Connection retry is a functionality that prevents extractions from failing in case of transient connection interruptions to Microsoft Azure Storage. Xtract Universal follows an exponential retry strategy. The selected exponential strategy results in seven retry attempts and an overall timespan of 140 seconds. If a connection is not established during the timespan of 140 seconds, the extraction fails.
The retry function is applied after receiving one of the following HTTP errors or exceptions:
- 503 Service Unavailable
- 504 Gateway Timeout
- WebExceptionStatus.ConnectionClosed
- WebExceptionStatus.ConnectFailure
- WebExceptionStatus.Timeout
- WebExceptionStatus.RequestCanceled
- WebExceptionStatus.SendFailure
- WebExceptionStatus.NameResolutionFailure
Rollback covers scenarios where extractions do not fail due to connection failures to Azure but due to an error when connecting to SAP. In those cases Xtract Universal tries to remove any files from Azure storage that were created in the course of the extraction.
Assign the Microsoft Azure Storage Destination to an Extraction
Extractions write data to their assigned destination. Follow the steps below to assign a destination to an extraction:
- In the main window of the Designer, select an extraction.
- Click [ Destination]. The window “Destination Settings” opens.
- In the “Destination Settings” window, select a destination from the dropdown list.
- Optional: edit the destination settings.
- Click [OK] to confirm your input.
When running the extraction, the extracted SAP data is now written to the destination.
Destination Settings
The destination settings only affect the extraction that the destination is assigned to. To open the destination settings, select an extraction in the main window of the Designer and click [ Destination]. The window "Destination Settings" opens.
File Name
Determines the name of the target table. The following options are available:
Option | Description |
---|---|
Same as name of SAP object | Copy the name of the SAP object. |
Same as name of extraction | Adopt the name of the extraction. |
Fully qualified extraction name | Adopt the name of the extraction, including the path of the extraction. This option avoids conflicts, when the extraction names are not unique. Use the fully qualified extraction name when the same extraction name is used in multiple extraction groups. |
Custom | Define a name of your choice. |
Append timestamp
Add the timestamp in the UTC format (_YYYY_MM_DD_hh_mm_ss_fff) to the file name of the extraction
Note
If the name of an object does not begin with a letter, it will be prefixed with an ‘x’, e.g. an object by the name _namespace_tabname.csv
will be renamed x_namespace_tabname.csv
when uploaded to the destination. This is to ensure that all uploaded objects are compatible with Azure Data Factory, Hadoop and Spark, which require object names to begin with a letter or give special meaning to objects whose names start with certain non-alphabetic characters.
Use Script Expressions as Dynamic File Names
Script expressions can be used to generate a dynamic file name. This allows generating file names that are composed of an extraction's properties, e.g. extraction name, SAP source object. This scenario supports script expressions based on .NET and the following XU-specific custom script expressions:
Input | Description |
---|---|
#{Source.Name}# | Name of the extraction's SAP source. |
#{Extraction.ExtractionName}# | Name of the extraction. |
#{Extraction.FullyQualifiedExtractionName}# | Name of the extraction. If the extraction is part of an extraction group, the name of the extraction group is included in the extraction name. This option avoids conflicts, when the extraction names are not unique. |
#{Extraction.Type}# | Extraction type (Table, ODP, BAPI, etc.). |
#{Extraction.SapObjectName}# | Name of the SAP object the extraction is extracting data from. |
#{Extraction.Timestamp}# | Timestamp of the extraction. |
#{Extraction.SapObjectName.TrimStart("/".ToCharArray())}# | Removes the first slash '/' of an SAP object. Example: /BIO/TMATERIAL to BIO/TMATERIAL - prevents creating an empty folder in a file path. |
#{Extraction.SapObjectName.Replace('/', '_')}# | Replaces all slashes '/' of an SAP object. Example /BIO/TMATERIAL to _BIO_TMATERIAL - prevents splitting the SAP object name by folders in a file path. |
#{Extraction.Fields["FISCPER"].RangeSelections[0].LowerValue}# | Lower value of the range selection. |
#{Extraction.Fields["FISCPER"].RangeSelections[0].UpperValue}# | Upper value of the range selection. |
#{Extraction.Context}# | Only for ODP extractions: returns the context of the ODP object (SAPI, ABAP_CDS, etc). |
#{Extraction.Fields["[NameSelectionFiels]"].Selections[0].Value}# | Only for ODP extractions: returns the input value of a defined selection / filter. |
#{Odp.UpdateMode}# | Only for ODP extractions: returns the update mode (Delta, Full, Repeat) of the extraction. |
#{TableExtraction.WhereClause}# | Only for Table extractions: returns the WHERE clause of the extraction. |
Column Name Style
Defines the style of the column name. Following options are available:
Option | Description |
---|---|
Code | The SAP technical column name is used as column name in the destination e.g., MAKTX. |
PrefixedCode | The SAP technical column name is prefixed by SAP object name and the tilde character e.g., MAKT~MAKTX |
CodeAndText | The SAP technical column name and the SAP description separated by an underscore are used as column name in the destination e.g., MAKTX_Material Description (Short Text). |
TextAndCode | The SAP description and the SAP technical column name description separated by an underscore are used as column name in the destination e.g., Material Description (Short Text)_MAKTX. |
Text | The SAP description is used as column name in the destination e.g., Material Description (Short Text). |
Convert dates
Converts the character-type SAP date (YYYYMMDD, e.g., 19900101) to a special date format (YYYY-MM-DD, e.g., 1990-01-01). Target data uses a real date data-type and not the string data-type to store dates.
Year 0
Converts the SAP date 00000000 to the entered value.
Year 9999
Converts the SAP date 9999XXXX to the entered value.
Invalid values
If an SAP date cannot be converted to a valid date format, the invalid date is converted to the entered value. NULL is supported as a value. When converting the SAP date the two special cases 00000000 and 9999XXXX are checked first.
Blob Type
Append Blob
Creates an Append Blob.
Block Blob
Creates a Block Blob.
Note
For both file types an MD5 hash is created upon upload to Azure storage.
Folder
Writes the extracted data to a specific folder structure within the container. If the specified folder does not exist, it is created.
- Create a single folder by entering a folder name without slashes:
[folder]
- Create subfolders using the following syntax:
[folder]/[subfolder_1]/[subfolder_2]/[..]
Note
The specified folder path only applies to the selected extraction. To define a folder path for all extractions, use the Folder path option in the Destination Details.
Use Script Expressions as Dynamic Folder Paths
Script expressions can be used to generate a dynamic folder path. This allows generating folder paths that are composed of an extraction's properties, e.g., extraction name, SAP source object. The described scenario supports script expressions based on .NET and the following XU-specific custom script expressions:
Input | Description |
---|---|
#{Source.Name}# | Name of the extraction's SAP source. |
#{Extraction.ExtractionName}# | Name of the extraction. |
#{Extraction.FullyQualifiedExtractionName}# | Name of the extraction. If the extraction is part of an extraction group, the name of the extraction group is included in the extraction name. This option avoids conflicts, when the extraction names are not unique. |
#{Extraction.Type}# | Extraction type (Table, ODP, BAPI, etc.). |
#{Extraction.SapObjectName}# | Name of the SAP object the extraction is extracting data from. |
#{Extraction.Timestamp}# | Timestamp of the extraction. |
#{Extraction.SapObjectName.TrimStart("/".ToCharArray())}# | Removes the first slash '/' of an SAP object. Example: /BIO/TMATERIAL to BIO/TMATERIAL - prevents creating an empty folder in a file path. |
#{Extraction.SapObjectName.Replace('/', '_')}# | Replaces all slashes '/' of an SAP object. Example: /BIO/TMATERIAL to _BIO_TMATERIAL - prevents splitting the SAP object name by folders in a file path. |
#{Extraction.Context}# | Only for ODP extractions: returns the context of the ODP object (SAPI, ABAP_CDS, etc). |
#{Extraction.Fields["[NameSelectionFields]"].Selections[0].Value}# | Only for ODP extractions: returns the input value of a defined selection / filter. |
#{Odp.UpdateMode}# | Only for ODP extractions: returns the update mode (Delta, Full, Repeat) of the extraction. |
#{TableExtraction.WhereClause}# | Only for Table extractions: returns the WHERE clause of the extraction. |
#{Extraction.Fields["[0D_NW_CODE]"].Selections[0].Value}# | Only for BWCube extractions (MDX mode): returns the input value of a defined selection. |
#{Extraction.Fields["[0D_NW_CHANN]"].RangeSelections[0].LowerValue}# | Only for BWCube extractions (MDX mode): returns the lower input value of a defined selection range. |
#{Extraction.Fields["[0D_NW_CHANN]"].RangeSelections[0].UpperValue}# | Only for BWCube extractions (MDX mode): returns the upper input value of a defined selection range. |
#{Extraction.Fields["0D_NW_CODE"].Selections[0].Value}# | Only for BWCube extractions (BICS mode): returns the input value of a defined selection. |
#{Extraction.Fields["0D_NW_CHANN"].RangeSelections[0].LowerValue}# | Only for BWCube extractions (BICS mode): returns the lower input value of a defined selection range. |
#{Extraction.Fields["0D_NW_CHANN"].RangeSelections[0].UpperValue}# | Only for BWCube extractions (BICS mode): returns the upper input value of a defined selection range. |
Compression
Compression is only available for the csv file format, see Destination Details: File Format.
GZip
The data is transferred compressed and stored as a gz file.
File Splitting
Writes extraction data of a single extraction to multiple files. Each filename is appended by _part[nnn].
Max. file size
The value set in Max. file size determines the maximum size of each file.
Note
The option Max. file size does not apply to gzip files. The size of a gzipped file cannot be determined in advance.
Empty Files
When this option is active, empty result sets create an empty file in the target environment. Deactivate this option to not create empty files.
Tutorial
The following YouTube tutorial shows how to set up Xtract Universal with the Azure Storage destination:
Related Links
- Knowledge Base Article: Authentication via Microsoft Entra ID for Azure Storage
- Integration via Azure Data Factory