使用Windows PowerShell脚本化订阅的问题

问题描述

我正在尝试使用Microsoft.sqlServer.Rmo.dll通过PowerShell编写复制对象的脚本。复制类型与推送订阅是事务性的。

我已经可以编写出版物,文章,PAL脚本,但是不能编写发布者侧的订阅脚本。

参考

[reflection.assembly]::LoadFrom("c:\\sql\\Microsoft.sqlServer.Rmo.dll") | out-null

ScriptOptions

$scriptargs =[Microsoft.sqlServer.Replication.ScriptOptions]::Creation `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludeCreateLogreaderAgent `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludeCreateMergeAgent `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludeCreateQueuereaderAgent `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludePublicationAccesses `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludeArticles `
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludePublisherSideSubscriptions`   #one way tried to get the subscriptions
-bor  [Microsoft.sqlServer.Replication.ScriptOptions]::IncludeGo

foreach($replicateddatabase in $repsvr.ReplicationDatabases)
{
    if ($replicateddatabase.TransPublications.Count -gt 0)
    {
        foreach($tranpub in $replicateddatabase.TransPublications)
        {
            **[string] $myscript=$tranpub.script($scriptargs)**   #Errors out here
            writetofile $myscript $filename 0
        }
    }
}

enter image description here

我尝试的另一种方法是从Scriptoptions中排除IncludePublisherSideSubscriptions,并尝试使用以下语句直接将其脚本化

foreach($replicateddatabase in $repsvr.ReplicationDatabases)
{
    if ($replicateddatabase.TransPublications.Count -gt 0)
    {
        foreach($tranpub in $replicateddatabase.TransPublications)
        { 
            [string] $subs=$tranpub.TransSubscriptions.script($scriptargs)   #another way but same error
            writetofile $subs $filename 0
        }
    }
}

我尝试的第三种方式:

$repsvr.ReplicationDatabases.TransPublications.TransSubscriptions.Script($scriptargs)

总的来说,我发现以下link很有帮助,因为我的代码主要基于但只是停留在发布方订阅的脚本之外。感谢您的帮助。

解决方法

Microsoft.SqlServer.Replication自SQL Server 2012(我认为)以来已被弃用,而自SQL Server 2017起,它为no longer available。按照链接尝试将版本切换到2017或2019。

如果您使用的是服务器2016及更低版本,则可能只需要从GAC(全局程序集缓存)中加载rmo程序集,即可为您完成此操作。

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Rmo')

如果出于某种原因,您不想或者不能使用GAC,请执行此操作

Add-Type -Path 'C:\path\to\dll\Microsoft.SqlServer.Rmo.dll'

我将进行挖掘,看看是否有其他方法可以做您想做的事情。

编辑:不确定我是否误解了有关RMO的文档,或者它们是否过时了

you take this link,它向您展示如何在Server 2019上使用RMO配置发布和分发。步骤2参考了this,它显示了ReplicationServer类。问题是,这是针对SQL Server 2016的。我不完全确定2016年以后是否支持此功能。