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"
}