Functions/CatalogItems/Set-RsDataSourceReference.ps1

# Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
# Licensed under the MIT License (MIT)


function Set-RsDataSourceReference
{
    <#
        .SYNOPSIS
            Overrides the reference of a report or dataset to a shared data source.
        
        .DESCRIPTION
            Overrides the reference of a report or dataset to a shared data source.
        
        .PARAMETER Path
            Path of the report or dataset.
        
        .PARAMETER DataSourceName
            Name of the datasource reference to override.
        
        .PARAMETER DataSourcePath
            Path to the shared data source the reference will point to.
        
        .PARAMETER ReportServerUri
            Specify the Report Server URL to your SQL Server Reporting Services Instance.
            Use the "Connect-RsReportServer" function to set/update a default value.
        
        .PARAMETER Credential
            Specify the credentials to use when connecting to the Report Server.
            Use the "Connect-RsReportServer" function to set/update a default value.
        
        .PARAMETER Proxy
            Report server proxy to use.
            Use "New-RsWebServiceProxy" to generate a proxy object for reuse.
            Useful when repeatedly having to connect to multiple different Report Server.
        
        .EXAMPLE
            Set-RsDataSourceReference -Path /DataSet -DataSourceName DataSource1 -DataSourcePath /Datasources/SampleSource
            
            Description
            -----------
            Sets the dataset reference 'DataSource1' of dataset '/DataSet' to point to datasource '/Datasources/SampleSource'
    #>

    [CmdletBinding()]
    param (
        [Alias('ItemPath')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string[]] 
        $Path,

        [Parameter(Mandatory = $true)]
        [string]
        $DataSourceName,

        [Parameter(Mandatory = $true)]
        [string]
        $DataSourcePath,
        
        [string]
        $ReportServerUri,
        
        [Alias('ReportServerCredentials')]
        [System.Management.Automation.PSCredential]
        $Credential,
        
        $Proxy
    )
    
    Begin
    {
        $Proxy = New-RsWebServiceProxyHelper -BoundParameters $PSBoundParameters
    }
    
    Process
    {
        foreach ($item in $Path)
        {
            # For when running on Windows 6.1 with a permissive erroraction setting
            $dataSets = $null
            $dataSourceReference = $null
            
            try
            {
                $dataSets = $Proxy.GetItemReferences($item, "DataSource")
            }
            catch
            {
                throw (New-Object System.Exception("Failed to retrieve datasource item references for '$item': $($_.Exception.Message)", $_.Exception))
            }
            $dataSourceReference = $dataSets | Where-Object { $_.Name -eq $DataSourceName } | Select-Object -First 1
            
            if (-not $dataSourceReference)
            {
                throw "$item does not contain a dataSource reference with name $DataSourceName"
            }
            
            $proxyNamespace = $dataSourceReference.GetType().Namespace
            $dataSourceReference = New-Object "$($proxyNamespace).ItemReference"
            $dataSourceReference.Name = $DataSourceName
            $dataSourceReference.Reference = $DataSourcePath
            
            Write-Verbose "Set dataSource reference '$DataSourceName' of item $item to $DataSourcePath"
            try
            {
                $Proxy.SetItemReferences($item, @($dataSourceReference))
            }
            catch
            {
                throw (New-Object System.Exception("Failed to update datasource item references for '$item': $($_.Exception.Message)", $_.Exception))
            }
        }
    }
}

New-Alias -Name "Set-RsSharedDataSource" -Value Set-RsDataSourceReference -Scope Global