Create database on Azure SQL Managed Instance using Azure.Rm PowerShell library

Azure SQL Managed Instance is a fully managed SQL Server instance hosted in Microsoft Azure cloud that enables you to work with your databases using standard TSQL or PowerShell. In this post you will see how to create your database using PowerShell.

Prerequisites

In Azure SQL Managed Instance, you can use PowerShell to create a new database without connecting directly to your instance and executing CREATE DATABASE T-Sql statement. This is useful if you need to create some automation script that will create databases when they are needed.

You just need to install Azure RM PowerShell to manage your databases. In most of the cases the following  commands might install everything that you need:

 Install-Module PowerShellGet -Force

Install-Module -Name AzureRM -AllowClobber

Then, you just need an access to the subscription where you have some Azure SQL Managed Instances and you are ready to create databases.

Create new database

Once you install PowerShell libraries, you can create a new database using New-AzureRmResurce command, as shown in the following example:

 $subscriptionId = "a8cm4923-06c1-6bde-8758-e7c13a56e9m1"
$location = "West Central US"
$resourceGroup = "my-resource-group"

$managedInstance = "my-managed-instance"
$database = "my-db"

Select-AzureRmSubscription -SubscriptionId $subscriptionId
New-AzureRmResource -Location $location `
                    -ResourceId "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Sql/managedInstances/$managedInstance/databases/$database" `
                    -ApiVersion "2017-03-01-preview" `
                    -AsJob -Force

In the first section you need to set the parameters such as your subscription id, data center location, and the resource group where your instance is placed. Then you need set the name of the managed instance (without domain suffix) where you want to create a new database, and a database name.

New-AzureRmResurce command will create a new resource on the specified location using the formatted resource id. Optional parameter -AsJob specifies that the command should run asynchronously so it will complete immediately even if database creation time might be longer.

As a result, you will see a new empty database in your managed instance.

Create database as copy

You can also create a database as a copy of the existing database on managed instance. In addition to copy, you can specify a point in time in the past of the original database if you don’t want to create a copy of the latest state.

The following script will create a copy of existing database:

 $subscriptionId = "a8cm4923-06c1-6bde-8758-e7c13a56e9m1"
$location = "West Central US"

$resourceGroup = "my-resource-group"
$managedInstance = "my-managed-instance"
$database = "my-db"

$pointInTime = Get-Date # or "2018-06-01T08:51:39.3882806Z"

$targetDatabase = "my-db-copy"

$properties = New-Object System.Object
$properties | Add-Member -type NoteProperty -name CreateMode -Value "PointInTimeRestore"
$properties | Add-Member -type NoteProperty -name SourceDatabaseId -Value "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Sql/managedInstances/$managedInstance/databases/$database"
$properties | Add-Member -type NoteProperty -name RestorePointInTime -Value $pointInTime

Select-AzureRmSubscription -SubscriptionId $subscriptionId

New-AzureRmResource -Location $location `
                    -Properties $properties `
                    -ResourceId "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Sql/managedInstances/$managedInstance/databases/$targetDatabase" `
                    -ApiVersion "2017-03-01-preview" `
                    -AsJob -Force

The script is similar to the previous one with a difference in $properties object where you can specify that you want to create a database using PointInTimeRestore method from the source database.

When this job finishes, you will get a new database as a copy of source database at some point in time in the past.