Microsoft SQL Server
Adding and configuring Microsoft SQL Server connection within Qualytics empowers the platform to build a symbolic link with your database to perform operations like data discovery, visualization, reporting, syncing, profiling, scanning, anomaly surveillance, and more.
This documentation provides a step-by-step guide on adding Microsoft SQL Server as both a source and enrichment datastore in Qualytics. It covers the entire process, from initial connection setup to testing and finalizing the configuration.
By following these instructions, enterprises can ensure their Microsoft SQL Server environment is properly connected with Qualytics, unlocking the platform's potential to help you proactively manage your full data quality lifecycle.
Letβs get started π
Microsoft SQL Server Setup Guide
Qualytics connects to Microsoft SQL Server through the Microsoft JDBC driver for SQL Server. It queries system views (sys.schemas, sys.database_principals) to discover schemas and uses standard JDBC metadata APIs for tables, columns, and primary keys.
Minimum SQL Server Permissions (Source Datastore)
| Permission | Purpose |
|---|---|
CONNECT |
Allow the user to connect to the database |
SELECT ON SCHEMA::<schema_name> |
Read data from all tables and views for profiling and scanning |
VIEW DEFINITION ON SCHEMA::<schema_name> |
Read object definitions for metadata discovery |
SELECT ON sys.schemas |
Discover available schemas in the database |
SELECT ON sys.database_principals |
Resolve schema ownership for catalog discovery |
Additional Permissions for Enrichment Datastore
When using SQL Server as an enrichment datastore, the following additional permissions are required for Qualytics to write metadata tables (e.g., _qualytics_*):
| Permission | Purpose |
|---|---|
CREATE TABLE |
Create enrichment tables (_qualytics_*) |
INSERT ON SCHEMA::<schema_name> |
Write anomaly records, scan results, and check metrics |
UPDATE ON SCHEMA::<schema_name> |
Update enrichment records during rescans |
DELETE ON SCHEMA::<schema_name> |
Remove stale enrichment records |
ALTER ON SCHEMA::<schema_name> |
Modify enrichment table schemas during version migrations |
DROP TABLE |
Remove enrichment tables during cleanup or when the datastore is unlinked |
Example: Source Datastore User (Read-Only)
Replace <database_name>, <schema_name>, and <password> with your actual values.
-- Create a login at the server level
CREATE LOGIN qualytics_read WITH PASSWORD = β<password>β;
-- Switch to the target database
USE <database_name>;
-- Create a user mapped to the login
CREATE USER qualytics_read FOR LOGIN qualytics_read;
-- Grant connection and read-only access
GRANT CONNECT TO qualytics_read;
GRANT SELECT ON SCHEMA::<schema_name> TO qualytics_read;
GRANT VIEW DEFINITION ON SCHEMA::<schema_name> TO qualytics_read;
Example: Enrichment Datastore User (Read-Write)
-- Create a login at the server level
CREATE LOGIN qualytics_readwrite WITH PASSWORD = β<password>β;
-- Switch to the target database
USE <database_name>;
-- Create a user mapped to the login
CREATE USER qualytics_readwrite FOR LOGIN qualytics_readwrite;
-- Grant connection, read-write, and table management access
GRANT CONNECT TO qualytics_readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::<schema_name> TO qualytics_readwrite;
GRANT CREATE TABLE TO qualytics_readwrite;
GRANT ALTER ON SCHEMA::<schema_name> TO qualytics_readwrite;
GRANT VIEW DEFINITION ON SCHEMA::<schema_name> TO qualytics_readwrite;
Note
If using Service Principal authentication, ensure the Service Principal has been added as an external user in the database with the same permissions listed above. Use the Client ID, Client Secret, and Tenant ID from your Microsoft Entra ID app registration.
Note
Qualytics automatically filters out system schemas (INFORMATION_SCHEMA, sys, and schemas starting with db_) during catalog discovery. You do not need to restrict access to these schemas manually.
Troubleshooting Common Errors
| Error | Likely Cause | Fix |
|---|---|---|
Login failed for user |
Incorrect username or password, or the login does not exist | Verify the login exists at the server level with SELECT name FROM sys.sql_logins |
Cannot open database requested by the login |
The user does not have access to the specified database | Ensure a user is mapped to the login in the target database with CREATE USER ... FOR LOGIN |
The SELECT permission was denied on object |
The user lacks SELECT on one or more tables in the schema |
Run GRANT SELECT ON SCHEMA::<schema_name> TO <user> |
CREATE TABLE permission denied in database |
The enrichment user lacks CREATE TABLE permission |
Run GRANT CREATE TABLE TO <user> |
Cannot find the object because it does not exist or you do not have permissions |
The user lacks VIEW DEFINITION on the schema |
Run GRANT VIEW DEFINITION ON SCHEMA::<schema_name> TO <user> |
Detailed Troubleshooting Notes
Authentication Errors
The error Login failed for user indicates that the credentials are incorrect or the login does not exist at the server level.
Common causes:
- Incorrect password β the password does not match the one set for the login.
- Login does not exist β the login was never created at the server level with
CREATE LOGIN. - User not mapped β the login exists but no user is mapped to it in the target database.
- Service Principal misconfiguration β when using Entra ID authentication, the Client ID, Client Secret, or Tenant ID is incorrect.
Note
SQL Server distinguishes between logins (server-level) and users (database-level). A login must exist at the server level, and a corresponding user must be created in each target database.
Permission Errors
The error The SELECT permission was denied on object means the user authenticated successfully but lacks the necessary grants on the target schema.
Common causes:
- Missing
SELECT ON SCHEMAβ the user does not haveSELECTon the target schema. - Wrong schema β the user has permissions on
dbobut the target tables are in a different schema. - Missing
VIEW DEFINITIONβ the user cannot see object metadata needed for catalog discovery.
Connection Errors
The error Cannot open database requested by the login means the user does not have access to the specified database.
Common causes:
- No user in database β the login exists but
CREATE USER ... FOR LOGINwas not run in the target database. - Database does not exist β the database name in the connection form is incorrect.
- Database is offline β the target database is in a recovery or offline state.
Tip
Start by confirming credentials are valid (authentication errors), then verify schema/table permissions (permission errors), and finally check database access (connection errors).
Add a Source Datastore
A source datastore is a storage location used to connect to and access data from external sources. Microsoft SQL Server is an example of a source datastore, specifically a type of JDBC datastore that supports connectivity through the JDBC API. Configuring the JDBC datastore enables the Qualytics platform to access and perform operations on the data, thereby generating valuable insights.
Step 1: Log in to your Qualytics account and click on the Add Source Datastore button located at the top-right corner of the interface.

Step 2: A modal window - Add Datastore will appear, providing you with the options to connect a datastore.

| REF. | FIELDS | ACTIONS |
|---|---|---|
| 1. | Name (Required) | Specify the datastore name (e.g., This name will appear on the datastore cards) |
| 2. | Toggle Button | Toggle ON to create a new source datastore from scratch, or toggle OFF to reuse credentials from an existing connection. |
| 3. | Connector (Required) | Select Microsoft SQL Server from the dropdown list. |
Option I: Create a Source Datastore with a new Connection
If the toggle for Add New connection is turned on, then this will prompt you to add and configure the source datastore from scratch without using existing connection details.
Step 1: Select the Microsoft SQL Server connector from the dropdown list and add connection details such as Secret Management, host, port, username, password, and database.

Secrets Management: This is an optional connection property that allows you to securely store and manage credentials by integrating with HashiCorp Vault and other secret management systems. Toggle it ON to enable Vault integration for managing secrets.
Note
After configuring HashiCorp Vault integration, you can use ${key} in any Connection property to reference a key from the configured Vault secret. Each time the Connection is initiated, the corresponding secret value will be retrieved dynamically.
| REF | FIELDS | ACTIONS |
|---|---|---|
| 1. | Login URL | Enter the URL used to authenticate with HashiCorp Vault. |
| 2. | Credentials Payload | Input a valid JSON containing credentials for Vault authentication. |
| 3. | Token JSONPath | Specify the JSONPath to retrieve the client authentication token from the response (e.g., $.auth.client_token). |
| 4. | Secret URL | Enter the URL where the secret is stored in Vault. |
| 5. | Token Header Name | Set the header name used for the authentication token (e.g., X-Vault-Token). |
| 6. | Data JSONPath | Specify the JSONPath to retrieve the secret data (e.g., $.data). |

Step 2: The configuration form will expand, requesting credential details before establishing the connection.

| REF. | FIELDS | ACTIONS |
|---|---|---|
| 1. | Host (Required) | Get Hostname from your Microsoft SQL Server account and add it to this field. |
| 2. | Port (Optional) | Specify the Port number. |
| 3. | Authentication (Required) | Select the authentication type from the dropdown and provide the required credentials: If Username/Password is selected: β’ Enter the Username β’ Enter the Password If Service Principal is selected: β’ Enter the Client ID (Application ID) β’ Enter the Client Secret β’ Enter the Tenant ID |
| 4. | Database (Required) | Specify the database name. |
| 5. | Schema (Required) | Define the schema within the database that should be used. |
| 6. | Teams (Required) | Select one or more teams from the dropdown to associate with this source datastore. |
| 7. | Initiate Sync (Optional) | Tick the checkbox to automatically perform sync operation on the configured source datastore to detect new, changed, or removed containers and fields. |
Step 3: After adding the source datastore details, click on the Test Connection button to check and verify its connection.

If the credentials and provided details are verified, a success message will be displayed indicating that the connection has been verified.
Option II: Use an Existing Connection
If the toggle for Add new connection is turned off, then this will prompt you to configure the source datastore using the existing connection details.
Step 1: Select a connection to reuse existing credentials.

Note
If you are using existing credentials, you can only edit the details such as Database, Schema, Teams, and Initiate Sync.
Step 2: Click on the Test Connection button to verify the existing connection details. If connection details are verified, a success message will be displayed.

Note
Clicking on the Finish button will create the source datastore and bypass the enrichment datastore configuration step.
Tip
It is recommended to click on the Next button, which will take you to the enrichment datastore configuration page.
Add Enrichment Datastore
Once you have successfully tested and verified your source datastore connection, you have the option to add the enrichment datastore (recommended). The enrichment datastore is used to store the analyzed results, including any anomalies and additional metadata in tables. This setup provides full visibility into your data quality, helping you manage and improve it effectively.
Step 1: Whether you have added a source datastore by creating a new datastore connection or using an existing connection, click on the Next button to start adding the Enrichment Datastore.

Step 2: A modal window - Link Enrichment Datastore will appear, providing you with the options to configure to add an enrichment datastore.

| REF. | FIELDS | ACTIONS |
|---|---|---|
| 1. | Prefix (Required) | Add a prefix name to uniquely identify tables/files when Qualytics writes metadata from the source datastore to your enrichment datastore. |
| 2. | Caret Down Button | Click the caret down to select either Use Enrichment Datastore or Add Enrichment Datastore. |
| 3. | Enrichment Datastore | Select an enrichment datastore from the dropdown list. |
Option I: Create an Enrichment Datastore with a new Connection
If the toggle Add new connection is turned on, then this will prompt you to add and configure the enrichment datastore from scratch without using an existing enrichment datastore and its connection details.
Step 1: Click on the caret button and select Add Enrichment Datastore.

A modal window Link Enrichment Datastore will appear. Enter the following details to create an enrichment datastore with a new connection.

| REF. | FIELDS | ACTIONS |
|---|---|---|
| 1. | Prefix | Add a prefix name to uniquely identify tables/files when Qualytics writes metadata from the source datastore to your enrichment datastore. |
| 2. | Name | Give a name for the enrichment datastore. |
| 3. | Toggle Button for add new connection | Toggle ON to create a new enrichment from scratch or toggle OFF to reuse credentials from an existing connection. |
| 4. | Connector | Select a datastore connector from the dropdown list. |
Step 2: Add connection details for your selected enrichment datastore connector.

Step 3: Click on the Test Connection button to verify the selected enrichment datastore connection. If the connection is verified, a flash message will indicate that the connection with the datastore has been successfully verified.

Step 4: Click on the Finish button to complete the configuration process.

When the configuration process is finished, a modal will display a success message indicating that your datastore has been successfully added.
Close the Success dialog and the page will automatically redirect you to the Source Datastore Details page where you can perform data operations on your configured source datastore.

Option II: Use an Existing Connection
If the Use enrichment datastore option is selected from the caret button, you will be prompted to configure the datastore using existing connection details.
Step 1: Click on the caret button and select Use Enrichment Datastore.

Step 2: A modal window Link Enrichment Datastore will appear. Add a prefix name and select an existing enrichment datastore from the dropdown list.

| REF. | FIELDS | ACTIONS |
|---|---|---|
| 1. | Prefix (Required) | Add a prefix name to uniquely identify tables/files when Qualytics writes metadata from the source datastore to your enrichment datastore. |
| 2. | Enrichment Datastore | Select an enrichment datastore from the dropdown list. |
Step 3: After selecting an existing enrichment datastore connection, you will view the following details related to the selected enrichment:
-
Teams: The team associated with managing the enrichment datastore is based on the role of public or private. Example- Marked as Public means that this datastore is accessible to all the users.
-
Host: This is the server address where the Microsoft SQL Server instance is hosted. It is the endpoint used to connect to the Microsoft SQL Server environment.
-
Database: Refers to the specific database within the Microsoft SQL Server environment where the data is stored.
-
Schema: The schema used in the enrichment datastore. The schema is a logical grouping of database objects (tables, views, etc.). Each schema belongs to a single database.

Step 4: Click on the Finish button to complete the configuration process for the existing enrichment datastore.

When the configuration process is finished, a modal will display a success message indicating that your data has been successfully added.
Close the success message and you will be automatically redirected to the Source Datastore Details page where you can perform data operations on your configured source datastore.

API Payload Examples
This section provides detailed examples of API payloads to guide you through the process of creating and managing datastores using Qualytics API.
Each example includes endpoint details, sample payloads, and instructions on how to replace placeholder values with actual data relevant to your setup.
Creating a Source Datastore
This section provides sample payloads for creating a Microsoft SQL Server datastore. Replace the placeholder values with actual data relevant to your setup.
Endpoint: /api/datastores (post)
{
"name": "your_datastore_name",
"teams": ["Public"],
"database": "sqlserver_database",
"schema": "sqlserver_schema",
"enrich_only": false,
"trigger_catalog": true,
"connection": {
"name": "your_connection_name",
"type": "sqlserver",
"host": "sqlserver_host",
"port": "sqlserver_port",
"username": "sqlserver_username",
"password": "sqlserver_password"
}
}
# Step 1: Create a Connection
qualytics connections create \
--type sqlserver \
--name "your_connection_name" \
--host ${SQLSERVER_HOST} \
--port 1433 \
--username ${SQLSERVER_USER} \
--password ${SQLSERVER_PASSWORD}
# Step 2: Create a Source Datastore
qualytics datastores create \
--name "your_datastore_name" \
--connection-name "your_connection_name" \
--database your_database \
--schema dbo
Creating an Enrichment Datastore
This section provides sample payloads for creating an enrichment datastore. Replace the placeholder values with actual data relevant to your setup.
Endpoint: /api/datastores (post)
{
"name": "your_datastore_name",
"teams": ["Public"],
"database": "sqlserver_database",
"schema": "sqlserver_enrichment_schema",
"enrich_only": true,
"connection": {
"name": "your_connection_name",
"type": "sqlserver",
"host": "sqlserver_host",
"port": "sqlserver_port",
"username": "sqlserver_username",
"password": "sqlserver_password"
}
}
# Step 1: Create a Connection
qualytics connections create \
--type sqlserver \
--name "your_connection_name" \
--host ${SQLSERVER_HOST} \
--port 1433 \
--username ${SQLSERVER_USER} \
--password ${SQLSERVER_PASSWORD}
# Step 2: Create an Enrichment Datastore
qualytics datastores create \
--name "your_datastore_name" \
--connection-name "your_connection_name" \
--database your_database \
--schema your_enrichment_schema \
--enrichment-only
Link an Enrichment Datastore to a Source Datastore
Use the provided endpoint to link an enrichment datastore to a source datastore:
Endpoint Details: /api/datastores/{datastore-id}/enrichment/{enrichment-id} (patch)