【问题标题】:Issue with scripting out subscriptions using Windows PowerShell使用 Windows PowerShell 编写订阅脚本的问题
【发布时间】:2021-01-24 21:45:32
【问题描述】:

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

我已经能够编写出版物、文章、PAL,但无法编写出版商订阅。

参考

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

脚本选项

$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
        }
    }
}

我尝试的另一种方法是从 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.dll?另外,请注意,根据我的研究,Rmo 命名空间/api 已被弃用。
  • 您是否使用 [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Rmo') | 加载程序集Out-Null OR Add-Type -AssemblyName "Microsoft.SqlServer.Rmo, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop
  • 您好,我认为您必须删除 $scriptargs 中存在的您的评论,此中断多行变量“#one way试图获取订阅”
  • @marsze 贬低...嗯?将对此进行更多研究。如果你能提供你看到它的链接,它会有所帮助。
  • @Sanpas 如果您看到#cmets,请忽略。它只是为了帮助观众,因为我无法将我没有使用 loadwithparticalname 的行加粗,因为我正在测试的服务器正在产生错误。因此,我使用了 LoadFrom 并从外部复制并在自定义位置提供了 Rmo.dll。

标签: sql-server powershell replication transactional-replication


【解决方案1】:

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 年以后是否支持。

【讨论】:

  • 谢谢,但我想我已经使用了你提到的参考资料(仅供参考,sqlserver 是 2017 年)。我已经编辑了我的原始问题,以显示我是如何使用参考的。在所有选项中,我已在 IncludeArticles、IncludeGo 等问题中显示,只有在添加 IncludePublisherSideSubscriptions 时才会出现错误。问题是,它适用于一种选择,但不适用于另一种。
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多