diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1
index b82705648..80a91e397 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1
@@ -39,6 +39,8 @@ $environmentName = "sqlhack"
$sharedResourceGroupName = "rg-sqlhack-shared"
$adminUsername = "DemoUser"
$adminPassword = New-MhhStablePassword -Purpose 'vm-admin' -SubscriptionId $SubscriptionId -ResourceGroupName "Default"
+$sqlMiAdminUsername = "DemoUser"
+$sqlMiAdminPassword = New-MhhStablePassword -Purpose 'sqlmi-admin' -SubscriptionId $SubscriptionId -ResourceGroupName "Default"
# Template file path
$templatePath = Join-Path $scriptPath "infra"
@@ -88,6 +90,7 @@ $vmPostfix = $vmPostfix -replace "_", "-"
$vmName = "VM-$vmPostfix"
$TeamName = $me.ShortName
$TeamName = $TeamName.ToUpper()
+$SqlMiSysadminUser = $me.UserPrincipalName
# feed the effective resource group back to the console
#@{"HackboxCredential" = @{ name = "ResourceGroupName" ; value = $effectiveResourceGroup; note = "The name of the resource group where lab resources are deployed" }}
@@ -120,6 +123,9 @@ $result = Invoke-MhhDeploymentWithRegionFallback `
vmName = $vmName
TeamName = $TeamName
legacySQLName = $legacySQLName
+ sqlMiAdminUsername = $sqlMiAdminUsername
+ sqlMiAdminPassword = $sqlMiAdminPassword
+ SqlMiSysadminUser = $SqlMiSysadminUser
}
Write-Host "[$SubscriptionId] Lab deployment completed successfully"
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep
index e670249bf..fff8c9312 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep
@@ -101,6 +101,8 @@ module legacySqlVm 'modules/sql2016-vm.bicep' = {
vmSize: legacyVmSize
adminUsername: adminUsername
adminPassword: adminPassword
+ sqlMiAdminUsername: sqlMiAdminUsername
+ sqlMiAdminPassword: sqlMiAdminPassword
tags: tags
}
}
@@ -116,6 +118,8 @@ module sqlarcSqlVm 'modules/sql2022-vm.bicep' = {
vmSize: sqlarcVmSize
adminUsername: adminUsername
adminPassword: adminPassword
+ sqlMiAdminUsername: sqlMiAdminUsername
+ sqlMiAdminPassword: sqlMiAdminPassword
tags: tags
}
}
@@ -193,6 +197,8 @@ module sqlarcSqlVm_cse 'modules/sql2022-vm-cse.bicep' = {
vmName: 'arcSQL2022'
adminUsername: adminUsername
adminPassword: adminPassword
+ sqlMiAdminUsername: sqlMiAdminUsername
+ sqlMiAdminPassword: sqlMiAdminPassword
repoBaseURL: repoBaseURL
}
}
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep
index 14626fae2..7f0ca31e0 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep
@@ -21,6 +21,12 @@ param adminUsername string
@secure()
param adminPassword string
+param sqlMiAdminUsername string
+@secure()
+param sqlMiAdminPassword string
+
+param SqlMiSysadminUser string
+
param teamVmSize string = 'Standard_D2s_v5'
param tags object = {
@@ -67,6 +73,9 @@ module teamVms_cse 'modules/team-vm-cse.bicep' = {
legacySQLName: legacySQLName
adminUsername: adminUsername
adminPassword: adminPassword
+ sqlMiAdminUsername: sqlMiAdminUsername
+ sqlMiAdminPassword: sqlMiAdminPassword
+ SqlMiSysadminUser: SqlMiSysadminUser
}
}
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep
index 9cd6379cc..7d5c514b8 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep
@@ -4,9 +4,11 @@ param subnetId string
param privateIPAddress string
param vmSize string
param adminUsername string
-
@secure()
param adminPassword string
+param sqlMiAdminUsername string
+@secure()
+param sqlMiAdminPassword string
param tags object
@@ -119,8 +121,8 @@ resource sqlVirtualMachine 'Microsoft.SqlVirtualMachine/sqlVirtualMachines@2023-
connectivityType: 'PRIVATE'
port: 1433
- sqlAuthUpdateUserName: adminUsername
- sqlAuthUpdatePassword: adminPassword
+ sqlAuthUpdateUserName: sqlMiAdminUsername
+ sqlAuthUpdatePassword: sqlMiAdminPassword
}
}
}
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep
index 97fc162fe..2ac5b9e24 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep
@@ -6,6 +6,10 @@ param adminUsername string
@secure()
param adminPassword string
+param sqlMiAdminUsername string
+@secure()
+param sqlMiAdminPassword string
+
var ConfigureSQLMachineCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-newsql.ps1" -BackupUri "https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak" -adminUsername ${adminUsername} -adminPassword ${adminPassword}'
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-11-01' existing = {
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep
index af35d1ddf..fe1fbfee2 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep
@@ -4,9 +4,11 @@ param subnetId string
param privateIPAddress string
param vmSize string
param adminUsername string
-
@secure()
param adminPassword string
+param sqlMiAdminUsername string
+@secure()
+param sqlMiAdminPassword string
param tags object
@@ -115,8 +117,8 @@ resource sqlVirtualMachine 'Microsoft.SqlVirtualMachine/sqlVirtualMachines@2023-
connectivityType: 'PRIVATE'
port: 1433
- sqlAuthUpdateUserName: adminUsername
- sqlAuthUpdatePassword: adminPassword
+ sqlAuthUpdateUserName: sqlMiAdminUsername
+ sqlAuthUpdatePassword: sqlMiAdminPassword
}
}
}
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep
index 0f5b85714..565ef49d8 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep
@@ -9,8 +9,15 @@ param adminUsername string
@secure()
param adminPassword string
+param sqlMiAdminUsername string
+@secure()
+param sqlMiAdminPassword string
+
+param SqlMiSysadminUser string
+
+
//var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamNumber ##teamNumber##'
-var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamName ${TeamName} -LabsBaseUri "${repoBaseURL}/LABS" -ManagedInstanceServer "${managedInstanceServer}" -StorageAccountName "${storageAccountName}" -BackupBaseUri "${repoBaseURL}/Databases" -ServerInstance "${legacySQLName}" -adminUsername "${adminUsername}" -adminPassword "${adminPassword}"'
+var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamName ${TeamName} -LabsBaseUri "${repoBaseURL}/LABS" -ManagedInstanceServer "${managedInstanceServer}" -StorageAccountName "${storageAccountName}" -BackupBaseUri "${repoBaseURL}/Databases" -ServerInstance "${legacySQLName}" -adminUsername "${adminUsername}" -adminPassword "${adminPassword}" -sqlMiAdminUsername "${sqlMiAdminUsername}" -sqlMiAdminPassword "${sqlMiAdminPassword}" -SqlMiSysadminUser "${SqlMiSysadminUser}"'
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-11-01' existing = {
name: vmName
}
@@ -34,6 +41,7 @@ resource ConfigureTeamMachine 'Microsoft.Compute/virtualMachines/extensions@2024
'${repoBaseURL}/scripts/Configure-Teams-Shortcuts.ps1'
'${repoBaseURL}/scripts/Restore-TeamDatabases.ps1'
'${repoBaseURL}/scripts/Configure-legacySQL-DB.ps1'
+ '${repoBaseURL}/scripts/Configure-SQLMI-Sysadmins.ps1'
'${repoBaseURL}/scripts/Download-Labs.ps1'
'${repoBaseURL}/scripts/Configure-TeamWallpaper.ps1'
]
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1
new file mode 100644
index 000000000..2f3fed987
--- /dev/null
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1
@@ -0,0 +1,64 @@
+param(
+ [Parameter(Mandatory)]
+ [string]$ManagedInstanceServer,
+
+ [Parameter(Mandatory)]
+ [string] $sqlusername,
+
+ [Parameter(Mandatory)]
+ [string] $sqlpassword,
+
+ [Parameter(Mandatory)]
+ [string] $sqlMiSysadminUser
+)
+
+$ErrorActionPreference = 'Stop'
+
+$logPath = 'C:\Windows\Temp\Configure-SQLMI-Sysadmins.log'
+Start-Transcript -Path $logPath -Append
+
+Write-Host 'Configuring SQL Managed Instance Sysadmins...'
+
+$ConfigureSql = @"
+IF NOT EXISTS (SELECT 1 FROM sys.server_principals WHERE name = N'$sqlMiSysadminUser')
+BEGIN
+ CREATE LOGIN [$sqlMiSysadminUser] FROM EXTERNAL PROVIDER;
+END
+ALTER SERVER ROLE [sysadmin] ADD MEMBER [$sqlMiSysadminUser];
+"@
+
+[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
+[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
+
+$connectionString = "Data Source=$ManagedInstanceServer;Initial Catalog=master;TrustServerCertificate=True;"
+$Connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
+[System.Security.SecureString]$SQLPwd = $sqlpassword | ConvertTo-SecureString -AsPlainText -Force
+$SQLPwd.MakeReadOnly()
+$cred = New-Object System.Data.SqlClient.SqlCredential($sqlusername,$SQLPwd)
+$Connection.credential = $cred
+
+# 5. SMO-Serververbindung initialisieren
+$serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($Connection)
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverConnection)
+
+try {
+ # Ausführung des Skripts inkl. GO-Trenner
+ [void]$server.ConnectionContext.ExecuteNonQuery($ConfigureSql)
+ #Write-Host "Skript erfolgreich auf SQL MI ausgeführt." -ForegroundColor Green
+}
+catch {
+ $ErrorString = $_ | format-list -force | Out-String
+ Write-Error "ERR: $ErrorString"
+}
+finally {
+ if ($null -ne $serverConnection -and $serverConnection.IsOpen) {
+ $serverConnection.Disconnect()
+ }
+}
+try {
+ $Connection.Close()
+}
+catch {
+}
+
+Stop-Transcript
\ No newline at end of file
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1
index 8c1db7b83..7dbc860f6 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1
@@ -4,11 +4,14 @@ param(
[string]$BackupBaseUri,
[string]$adminUsername,
[string]$adminPassword,
+ [string]$sqlMiAdminUsername,
+ [string]$sqlMiAdminPassword,
[string]$WallpaperUri,
[string]$TeamName,
[string]$ManagedInstanceServer,
[string]$StorageAccountName,
- [string]$ServerInstance
+ [string]$ServerInstance,
+ [string]$SqlMiSysadminUser
)
$ErrorActionPreference = 'Stop'
@@ -23,10 +26,13 @@ Write-Host "Configure Team Wallpaper..."
& .\Configure-TeamWallpaper.ps1 -WallpaperUri $WallpaperUri -TeamName $TeamName
Write-Host "Restoring Team Databases..."
-& .\Restore-TeamDatabases.ps1 -TeamName $TeamName -BackupBaseUri $BackupBaseUri -sqlusername $adminUsername -sqlpassword $adminPassword -ServerInstance $ServerInstance
+& .\Restore-TeamDatabases.ps1 -TeamName $TeamName -BackupBaseUri $BackupBaseUri -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -ServerInstance $ServerInstance
Write-Host "Configuring Team Databases..."
-& .\Configure-legacySQL-DB.ps1 -TeamName $TeamName -sqlusername $adminUsername -sqlpassword $adminPassword -ServerInstance $ServerInstance
+& .\Configure-legacySQL-DB.ps1 -TeamName $TeamName -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -ServerInstance $ServerInstance
+
+Write-Host "Configuring SQL MI Sysadmins..."
+& .\Configure-SQLMI-Sysadmins.ps1 -ManagedInstanceServer $ManagedInstanceServer -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -sqlMiSysadminUser $SqlMiSysadminUser
Write-Host "Installing Team Tools..."
& .\install-team-tools.ps1
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1
index e5324b91c..ef2ee228e 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1
@@ -240,6 +240,148 @@ if (-not $found)
throw "Expected Entra ID Admin was not configured within 2 minutes."
}
+#Adding Sysadmin role to the Entra ID Admin on the SQLMI
+# SQL MI connection details
+$server = $managedInstanceFQDN
+$database = "master"
+$username = $sqlMiAdminUsername
+$password = $sqlMiAdminPassword
+
+# Entra ID users/groups to add
+$principals = Get-MhhLabUser -UserId @($AllowedEntraUserIds) | Where-Object { $_.ShortName.ToLower() -match "labuser-[0-9]{4}"} | Select-Object -ExpandProperty UserPrincipalName
+
+# Connection string
+$connectionString = @"
+Server=tcp:$server;
+Initial Catalog=$database;
+User ID=$username;
+Password=$password;
+Encrypt=True;
+TrustServerCertificate=False;
+Connection Timeout=30;
+"@
+
+# Load SqlClient
+Add-Type -AssemblyName System.Data
+
+$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
+
+try {
+ $conn.Open()
+
+ foreach ($principal in $principals) {
+
+ Write-Host "Processing $principal ..."
+
+ #
+ # Check whether login exists
+ #
+ $cmd = $conn.CreateCommand()
+ $cmd.CommandText = @"
+ SELECT COUNT(*)
+ FROM sys.server_principals
+ WHERE name = @name;
+"@
+
+ $null = $cmd.Parameters.Add(
+ "@name",
+ [System.Data.SqlDbType]::NVarChar,
+ 256
+ )
+
+ $cmd.Parameters["@name"].Value = $principal
+
+ $exists = [int]$cmd.ExecuteScalar()
+
+ if ($exists -eq 0) {
+
+ Write-Host " Creating Entra login"
+
+ # Object names cannot be parameterised, therefore QUOTENAME()
+ $createCmd = $conn.CreateCommand()
+ $createCmd.CommandText = @"
+ DECLARE @sql nvarchar(max);
+
+ SET @sql =
+ N'CREATE LOGIN ' +
+ QUOTENAME(@name) +
+ N' FROM EXTERNAL PROVIDER';
+
+ EXEC (@sql);
+"@
+
+ $null = $createCmd.Parameters.Add(
+ "@name",
+ [System.Data.SqlDbType]::NVarChar,
+ 256
+ )
+
+ $createCmd.Parameters["@name"].Value = $principal
+
+ $createCmd.ExecuteNonQuery() | Out-Null
+ }
+
+ #
+ # Add to sysadmin if not already a member
+ #
+ $roleCheck = $conn.CreateCommand()
+ $roleCheck.CommandText = @"
+ SELECT COUNT(*)
+ FROM sys.server_role_members rm
+ JOIN sys.server_principals r
+ ON rm.role_principal_id = r.principal_id
+ JOIN sys.server_principals p
+ ON rm.member_principal_id = p.principal_id
+ WHERE r.name = N'sysadmin'
+ AND p.name = @name;
+"@
+
+ $null = $roleCheck.Parameters.Add(
+ "@name",
+ [System.Data.SqlDbType]::NVarChar,
+ 256
+ )
+
+ $roleCheck.Parameters["@name"].Value = $principal
+
+ $isSysAdmin = [int]$roleCheck.ExecuteScalar()
+
+ if ($isSysAdmin -eq 0) {
+
+ Write-Host " Adding to sysadmin"
+
+ $roleCmd = $conn.CreateCommand()
+ $roleCmd.CommandText = @"
+ DECLARE @sql nvarchar(max);
+
+ SET @sql =
+ N'ALTER SERVER ROLE [sysadmin] ADD MEMBER ' +
+ QUOTENAME(@name);
+
+ EXEC (@sql);
+"@
+
+ $null = $roleCmd.Parameters.Add(
+ "@name",
+ [System.Data.SqlDbType]::NVarChar,
+ 256
+ )
+
+ $roleCmd.Parameters["@name"].Value = $principal
+
+ $roleCmd.ExecuteNonQuery() | Out-Null
+ }
+ else {
+ Write-Host " Already sysadmin"
+ }
+ }
+}
+finally {
+ if ($conn.State -eq 'Open') {
+ $conn.Close()
+ }
+}
+
$rg = Get-AzResourceGroup -Name $sharedResourceGroup -ErrorAction SilentlyContinue
$tags = $rg.Tags
$tags["microhack-shared-deployment"] = "Succeeded"
diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md
index ad47070f4..29a03f56e 100644
--- a/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md
+++ b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md
@@ -24,6 +24,7 @@

+
# Generic Migration Content
| **Narrative** | **Notes** |
@@ -33,13 +34,13 @@
# Connect to your Win11 VM
|**Narrative**| **Screenshot**| **Notes**|
|:------------|:--------------|:---------|
-|The instructors will share URLs to connect to your Win11 VM. Credentials will be provided during the Hack.|| |
+|Connect to the Azure Portal with and password . In the Azure Portal open your Win11 VM . Connect to the VM with Bastion with the following VM connection credentials Username and password . Please make sure to select the correct keyboard layout.|| |
|**Narrative**| **Screenshot**| **Notes**|
|:------------|:--------------|:---------|
-| On the Win11 VM you will find a shortcurt for SQL Server Management Studio (SSMS) and a readme.txt that comtains the information about the lab environment | 
+| On the Win11 VM you will find a shortcurt for SQL Server Management Studio (SSMS).| 
# Assess the application databases for Azure SQL suitability using the SQL Server Management Studio (SSMS)
@@ -47,8 +48,8 @@ In this section we will use the SQL Server Management Studio to assess the SQL S
|**Narrative**| **Screenshot**| **Notes**|
|:------------|:--------------|:---------|
-|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win11 Management VM**,** if so run SSMS from the Start menus or Desktop icon.||SQL Server Management Studio (SSMS) is a free download from Microsoft. Since SSMS 22.5 it supports the assessment and migration of SQL Server databases to Azure SQL.|
-|Connect to legacySQL2016 by using Wndows Authentivation. Please check the Trust Server Certifcate checkbox|||
+|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win11 Management VM**,** if so run SSMS from the Start menus or Desktop icon.||SQL Server Management Studio (SSMS) is a free download from Microsoft. Since SSMS 22.5 it supports the assessment and migration of SQL Server databases to Azure SQL.|
+|Connect to legacySQL2016 by using Windows Authentication. Please check the Trust Server Certifcate checkbox|||
|From the context menu of the SQL Server instance select Migrate SQL Server||If the context menu is not visible the Hybrid and Migration workload was not installed with SSMS |
|This opens the main screen for the migration experience|||
|Click **Run Readiness Assessment**||The assessment will take some seconds to minutes depending on the number of databases and the amount of database objects.|