Dyota's blog

SQL database: extract all view definitions

function dwh-login ($tenantId) {
    # get tenant id from here:
    # https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview

    if ($null -eq $tenantId) {
        Write-Host "Connect-AzAccount: No tenant ID specified"
        break;
    }

    $current = Get-AzAccessToken -ResourceUrl "https://database.windows.net"
    $expiry = ([System.DateTimeOffset] $current.ExpiresOn).LocalDateTime
    $now = [datetime]::Now

    if ( $current.TenantId -ne $tenantId ) { Write-Host "Tenant ID is not the same" }
    if ( $null -eq $current ) { Write-Host "No access token" }
    if ( $expiry -lt $now ) { Write-Host "Access token is expired ($($current.ExpiresOn))" } else { Write-Host "Access token is still valid (until $expiry)" }

    if (
        
        ( $current.TenantId -ne $tenantId ) -or
        ($null -eq $current) -or 
        ( $expiry -lt $now )
    ) {
        Write-Host "Logging in"

        [void] (Connect-AzAccount -TenantId $tenantId)

        Write-Host "Access token received"
        
    } else {
        Write-Host "Already logged in; continuing..."
    }

}

function dwh-query (
    $sqlEndpoint,
    $db,
    $query,
    $accessToken
) {
    # https://stackoverflow.com/questions/78543710/powershell-can-not-run-connect-azaccount-when-opening-the-powershell-as-differe
    # Import-Module SQLServer
    # Import-Module Az.Accounts -MinimumVersion 2.2.0
    
    $truncated = if ($query.length -gt 50) { "$($query.Substring(0, 50))..." } else { $query }

    $startTime = (Get-Date -Format "HH:mm:ss")

    Write-Host "Hitting $sqlEndpoint; $db"
    Write-Host "Sending query, $truncated"
    Write-Host "[$startTime] Awaiting result..."
    
    $res = Invoke-Sqlcmd -ServerInstance $sqlEndpoint -Database $db -AccessToken $accessToken -query $query 
    
    $endTime = (Get-Date -Format "HH:mm:ss")

    Write-Host "[$endTime] Result obtained ($($res.Count) rows)`n"

    return $res

}

<# 
config.json
{
    "tenantId": "<big long GUID>",
    "sqlEndpoint": "<SQL endpoint URL>", 
    "db": "<database name>"
}
#>

$config = cat ".\config.json" | ConvertFrom-Json -AsHashtable
$config
dwh-login $config.tenantId
$accessToken = (Get-AzAccessToken -ResourceUrl "https://database.windows.net").Token

$query = @"
SELECT 
    s.name AS 'schema'
    , o.name AS 'view'
    , definition
FROM sys.objects AS o
    LEFT JOIN sys.schemas AS s ON o.schema_id = s.schema_id
    LEFT JOIN sys.sql_modules AS m ON o.object_id = m.object_id
WHERE type_desc = 'VIEW'

ORDER BY o.name, s.name
"@

$args = $config + @{ query = $query; accessToken =  $accessToken }

$data = dwh-query @args

$data |
    % {
        $definition = $_.definition 
        $schema = $_.schema
        $dest = ".\Source\$schema"

        $viewName = $_.view

        if (!(Test-Path $dest)) { New-Item -ItemType Directory $dest}

        $definition > "$dest\$viewName.sql"

    }

#azure #powershell #sql