Skip to content
Back to Blog
1 min read

Essential Azure Data Studio Extensions

I wrote “Essential Azure Data Studio Extensions” to share practical, production-minded guidance on this topic.

Top Extensions

Admin Pack for SQL Server

# Install via Extensions marketplace
# Search: "Admin Pack for SQL Server"

# Features:
# - SQL Server Agent management
# - SQL Profiler
# - Server Reports
# - Import/Export wizard
-- With Admin Pack, you can run Agent jobs directly
-- Right-click on SQL Server Agent > Jobs > Start Job

-- View server reports for quick insights
-- Right-click database > Reports

Schema Compare

# Install: "Schema Compare" extension

# Features:
# - Compare database schemas
# - Generate deployment scripts
# - Sync schemas between environments
// Schema compare workflow
// 1. Open command palette (Ctrl+Shift+P)
// 2. Search "Schema Compare: New Schema Comparison"
// 3. Select source and target
// 4. Run comparison
// 5. Generate update script or apply changes

DACPAC Extension

# Enables working with Data-tier Applications

# Extract DACPAC from database
# Right-click database > Data-tier Application Wizard > Extract

# Deploy DACPAC to database
# Right-click Databases > Data-tier Application Wizard > Deploy

SQL Database Projects

# Install: "SQL Database Projects" extension

# Create a new database project
# File > New Project > SQL Database Project
-- Project structure
/*
MyDatabaseProject/
├── dbo/
│   ├── Tables/
│   │   ├── Customers.sql
│   │   └── Orders.sql
│   ├── Views/
│   │   └── vw_CustomerOrders.sql
│   ├── Stored Procedures/
│   │   └── sp_GetCustomerOrders.sql
│   └── Functions/
│       └── fn_CalculateTotal.sql
├── Security/
│   ├── Roles/
│   └── Users/
├── MyDatabaseProject.sqlproj
└── .gitignore
*/
<!-- Sample .sqlproj file -->
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0">
  <PropertyGroup>
    <Name>MyDatabaseProject</Name>
    <DSP>Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider</DSP>
    <ModelCollation>1033, CI</ModelCollation>
  </PropertyGroup>
  <ItemGroup>
    <Build Include="dbo\Tables\Customers.sql" />
    <Build Include="dbo\Tables\Orders.sql" />
    <Build Include="dbo\Stored Procedures\sp_GetCustomerOrders.sql" />
  </ItemGroup>
</Project>

PostgreSQL Extension

# Install: "PostgreSQL" extension

# Connect to PostgreSQL databases
# Azure Database for PostgreSQL
# Amazon RDS PostgreSQL
# Local PostgreSQL
-- PostgreSQL queries in Azure Data Studio
SELECT
    table_name,
    pg_size_pretty(pg_total_relation_size(quote_ident(table_name))) AS size
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY pg_total_relation_size(quote_ident(table_name)) DESC;

MySQL Extension

# Install: "MySQL" extension

# Connect to MySQL/MariaDB databases
# Azure Database for MySQL
# Local MySQL instances

SandDance for Data Exploration

# Install: "SandDance for Azure Data Studio"

# Visual data exploration
# Run a query, then click the SandDance icon in results
-- Query data, then visualize with SandDance
SELECT
    Category,
    Region,
    SUM(Sales) AS TotalSales,
    COUNT(*) AS TransactionCount
FROM dbo.SalesData
GROUP BY Category, Region;

-- After results appear, click SandDance icon for interactive visualization

PowerShell Extension

# Install: "PowerShell" extension

# Run PowerShell scripts directly in Azure Data Studio
# Integrate with dbatools for SQL Server management
# Example: Database backup script
Import-Module dbatools

$servers = @("server1", "server2", "server3")
$backupPath = "\\backup\sqlbackups"

foreach ($server in $servers) {
    $databases = Get-DbaDatabase -SqlInstance $server -ExcludeSystem

    foreach ($db in $databases) {
        Backup-DbaDatabase `
            -SqlInstance $server `
            -Database $db.Name `
            -Path $backupPath `
            -CompressBackup `
            -Checksum
    }
}
# Install: "Redgate SQL Search"

# Search across all database objects
# Find dependencies
# Navigate code quickly

Creating Custom Extensions

// package.json for a custom extension
{
    "name": "my-custom-extension",
    "displayName": "My Custom Extension",
    "version": "1.0.0",
    "engines": {
        "vscode": "^1.50.0",
        "azdata": ">=1.25.0"
    },
    "categories": ["Other"],
    "activationEvents": [
        "onCommand:myExtension.runHealthCheck"
    ],
    "contributes": {
        "commands": [
            {
                "command": "myExtension.runHealthCheck",
                "title": "Run Database Health Check"
            }
        ],
        "menus": {
            "objectExplorer/item/context": [
                {
                    "command": "myExtension.runHealthCheck",
                    "when": "nodeType == Database",
                    "group": "myExtension"
                }
            ]
        }
    }
}
// extension.ts
import * as azdata from 'azdata';
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    let disposable = vscode.commands.registerCommand(
        'myExtension.runHealthCheck',
        async () => {
            const connection = await azdata.connection.getCurrentConnection();

            if (!connection) {
                vscode.window.showErrorMessage('No active connection');
                return;
            }

            const provider = azdata.dataprotocol.getProvider<azdata.QueryProvider>(
                connection.providerId,
                azdata.DataProviderType.QueryProvider
            );

            const query = `
                SELECT
                    'Database Size' AS Metric,
                    CAST(SUM(size * 8 / 1024) AS VARCHAR) + ' MB' AS Value
                FROM sys.master_files
                WHERE database_id = DB_ID()
                UNION ALL
                SELECT
                    'Table Count',
                    CAST(COUNT(*) AS VARCHAR)
                FROM sys.tables
            `;

            // Execute and display results
            const uri = await azdata.queryeditor.connect(
                connection.connectionId,
                connection.options.database
            );

            await azdata.queryeditor.runQuery(uri, query);
        }
    );

    context.subscriptions.push(disposable);
}
// Create an extension pack for your team
{
    "name": "dba-extension-pack",
    "displayName": "DBA Extension Pack",
    "description": "Essential extensions for database administrators",
    "version": "1.0.0",
    "extensionPack": [
        "microsoft.admin-pack",
        "microsoft.schema-compare",
        "microsoft.sql-database-projects",
        "microsoft.dacpac",
        "redgate.sql-search",
        "microsoft.powershell"
    ]
}

Extension Management

# List installed extensions
azuredatastudio --list-extensions

# Install extension from command line
azuredatastudio --install-extension publisher.extension-name

# Uninstall extension
azuredatastudio --uninstall-extension publisher.extension-name

# Disable extension
# Preferences > Extensions > Find extension > Disable

Extensions transform Azure Data Studio into a comprehensive database development platform.\n\n## Takeaways\n\nAdd a concise, personal takeaway and recommended next steps here.\n

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.