Toolkit/Public/New-RscMssqlLiveMount.ps1

#Requires -Version 3
function New-RscMssqlLiveMount {
    <#
    .SYNOPSIS
    Creates a live mount of a Microsoft SQL Server database.

    .DESCRIPTION
    Mounts a point-in-time copy of a SQL Server database onto a target instance as a fully operational database. Live mounts let you access data for testing, reporting, or validation without affecting the production database. The mounted database is backed by Rubrik storage and can be removed when no longer needed with Remove-RscMssqlLiveMount.

    .LINK
    Schema reference:
    https://rubrikinc.github.io/rubrik-api-documentation/schema/reference

    .PARAMETER RscMssqlDatabase
    The MSSQL database object to mount. Pipe from Get-RscMssqlDatabase.

    .PARAMETER MountedDatabaseName
    The name for the mounted database on the target instance.

    .PARAMETER TargetMssqlInstance
    The destination SQL Server instance. Pipe from Get-RscMssqlInstance.

    .PARAMETER RecoveryDateTime
    Use Get-RscMssqlDatabaseRecoveryPoint to get a fully formatted date and time for the recovery point
    
    .PARAMETER TargetMssqlInstance
    SQL Server Instance Object returned from Get-RscMssqlInstance
    
    .PARAMETER AsQuery
    Return the query object instead of running the query.
    Preliminary read-only queries may still run to gather IDs or
    other data needed to build the main query.

    .EXAMPLE
    Returns the list of database files based on the latest recovery point
    
    New-RscMssqlLiveMount -RscMssqlDatabase $RscMssqlDatabase -TargetMssqlInstance $RscTargetMssqlInstance -RecoveryDateTime $RecoveryDateTime

The point-in-time to mount, in UTC. Use Get-RscMssqlDatabaseRecoveryPoint to obtain a properly formatted value.

    .EXAMPLE
    Live mount a database to a target instance at a specific recovery point.

    $db = Get-RscMssqlDatabase -Name AdventureWorks2019
    $inst = Get-RscMssqlInstance -HostName rp-sql1.rubrik-demo.com -clusterId "124d26df-c31f-49a3-a8c3-77b10c9470c2"
    $recovery = Get-RscMssqlDatabaseRecoveryPoint -RscMssqlDatabase $db -Latest
    New-RscMssqlLiveMount -RscMssqlDatabase $db -MountedDatabaseName "AW2019_Mount" -TargetMssqlInstance $inst -RecoveryDateTime $recovery

    .EXAMPLE
    Mount using a specific point-in-time value.

    $db = Get-RscMssqlDatabase -Name AdventureWorks2019
    $inst = Get-RscMssqlInstance -HostName rp-sql1.rubrik-demo.com -clusterId "124d26df-c31f-49a3-a8c3-77b10c9470c2"
    New-RscMssqlLiveMount -RscMssqlDatabase $db -MountedDatabaseName "AW2019_Test" -TargetMssqlInstance $inst -RecoveryDateTime "2024-01-15T10:00:00.000Z"
    #>


    [CmdletBinding(
    )]
    Param(
        [Parameter(
            Mandatory = $true
        )][RubrikSecurityCloud.Types.MssqlDatabase]$RscMssqlDatabase,

        [Parameter(
            Mandatory = $true
        )][String]$MountedDatabaseName,

        [Parameter(
            Mandatory = $true
        )][RubrikSecurityCloud.Types.MssqlInstance]$TargetMssqlInstance, 
       
        [Parameter(
            Mandatory = $true
        )][datetime]$RecoveryDateTime,

        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            HelpMessage = "Return the query object instead of running the query"
        )][Switch]$AsQuery
    )
    
    Process {
        Write-Debug "- Running New-RscMssqlLiveMount"
        #region Create Query
        $query = New-RscMutation -Gql createMssqlLiveMount 
        $query.Var.input = New-Object -TypeName RubrikSecurityCloud.Types.CreateMssqlLiveMountInput
        $query.Var.input.id = "$($RscMssqlDatabase.Id)"
        $query.Var.input.config = New-Object RubrikSecurityCloud.Types.MountMssqlDbConfigInput
        $query.Var.input.config.mountedDatabaseName = "$($MountedDatabaseName)"

        $query.Var.input.config.recoveryPoint = New-Object RubrikSecurityCloud.Types.MssqlRecoveryPointInput
        $query.Var.input.config.recoveryPoint.date = $RecoveryDateTime
        $query.Var.input.config.targetInstanceId = "$($TargetMssqlInstance.Id)"

        if ( $AsQuery ) { return $query }
        $result = $query.Invoke()
        $result
    } 
}