Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скрипт для скриптования репликации.  [new]
emperor_bms
Member

Откуда:
Сообщений: 122
Всем Доброго!

Извиняюсь за туповатое название топика, но на самом деле так оно и есть.

Думаю, что все, кто плотно сталкивался с репликацией в SQL 2005/2008, так или иначе скриптовали ее (т.е. публикации, статьи, подписчиков и пр.). Это можно сделать через интерфейс SSMS, выбрав пункт Generate Scripts в контекстном меню пункта Replication.

Вопрос: можно ли провернуть тоже самое (Generate scripts...), но скриптом?
29 май 12, 18:02    [12633533]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для скриптования репликации.  [new]
emperor_bms
Member

Откуда:
Сообщений: 122
Запустив профайлер в момент генерации скриптов увидел, что запускаются sp_helppublication, sp_helpsubscription, sp_helparticle и т.д. Потом, видимо, результаты парсятся и создается уже готовый скрипт для create/drop replication. То есть, в принципе, можно сваять такой скриптец, который бы для указанной БД скриптовал все (ну или избранные) публикации и подписки.

Может кто уже заморачивался, и есть какие-то наметки или готовый скрипт?
Особо не надеюсь, т.к. задача, видимо, редко кому нужная, но все-таки...
29 май 12, 18:28    [12633674]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для скриптования репликации.  [new]
Дмитрий_sql
Member

Откуда:
Сообщений: 35
emperor_bms
Запустив профайлер в момент генерации скриптов увидел, что запускаются sp_helppublication, sp_helpsubscription, sp_helparticle и т.д. Потом, видимо, результаты парсятся и создается уже готовый скрипт для create/drop replication. То есть, в принципе, можно сваять такой скриптец, который бы для указанной БД скриптовал все (ну или избранные) публикации и подписки.

Может кто уже заморачивался, и есть какие-то наметки или готовый скрипт?
Особо не надеюсь, т.к. задача, видимо, редко кому нужная, но все-таки...


А чем не устраивает стандартная репликация?
30 май 12, 12:06    [12636300]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для скриптования репликации.  [new]
IDimas
Member

Откуда:
Сообщений: 41
Тоже возникла такая задача, скорее всего буду писать на PS. Средствами T-SQL уж очень геморно.
15 июн 12, 20:50    [12722992]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт для скриптования репликации.  [new]
IDimas
Member

Откуда:
Сообщений: 41
Творение не мое, взято отсюда: http://www.replicationanswers.com/Powershell.asp
Но вроде работает нормально.

#Load command-line parameters - if they exist
param ([string]$sqlserver, [string]$filename)

#Reference RMO Assembly
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Replication") | out-null
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Rmo") | out-null

function errorhandler([string]$errormsg)
{
writetofile ("Replication Script Generator run at: " + (date)) $filename 1
writetofile ("[Replication Script ERROR] " + $errormsg) $filename 0
write-host("[Replication Script ERROR] " + $errormsg) -Foregroundcolor Red
}

function writetofile([string]$text, [string]$myfilename, [int]$cr_prefix)
{
if ($cr_prefix -eq 1) { "" >> $myfilename }
$text >> $myfilename
}

function initializefile([string]$myfilename)
{
"" > $myfilename
}

trap {errorhandler($_); Break}

#Deal with absent parameters
[string] $hostname=hostname
if ($sqlserver -eq "") {$sqlserver = read-host -prompt "Please enter the server name or leave blank for Hostname"}
if ($filename -eq "") {$filename = read-host -prompt "Please enter the file name (eg 'c:\ReplicationBackupScript.txt')..."}
if ($sqlserver -eq "") {$sqlserver = $hostname}
if ($filename -eq "") {$filename = "c:\ReplicationBackupScript.txt"}

$repsvr=New-Object "Microsoft.SqlServer.Replication.ReplicationServer" $sqlserver

Clear-host

initializefile $filename

# if we don't have any replicated databases then there's no point in carrying on
if ($repsvr.ReplicationDatabases.Count -eq 0)
{
writetofile ("Replication Script Generator run at: " + (date)) $filename 0
writetofile "ZERO replicated databases on $sqlserver!!!" $filename 1
EXIT
}

# similarly, if we don't have any publications then there's no point in carrying on
[int] $Count_Tran_Pub = 0
[int] $Count_Merge_Pub = 0

foreach($replicateddatabase in $repsvr.ReplicationDatabases)
{
$Count_Tran_Pub = $Count_Tran_Pub + $replicateddatabase.TransPublications.Count
$Count_Merge_Pub = $Count_Merge_Pub + $replicateddatabase.MergePublications.Count
}

if (($Count_Tran_Pub + $Count_Merge_Pub) -eq 0)
{
writetofile ("Replication Script Generator run at: " + (date)) $filename 0
writetofile "ZERO Publications on $sqlserver!!!" $filename 1
EXIT
}

# if we got this far we know that there are some publications so we'll script them out
# the $scriptargs controls exactly what the script contains
# for a full list of the $scriptargs see the end of this script
$scriptargs = [Microsoft.SqlServer.Replication.scriptoptions]::Creation `
-bor [Microsoft.SqlServer.Replication.scriptoptions]::IncludeArticles `
-bor [Microsoft.SqlServer.Replication.scriptoptions]::IncludePublisherSideSubscriptions `
-bor [Microsoft.SqlServer.Replication.scriptoptions]::IncludeSubscriberSideSubscriptions

writetofile ("Replication Script Generator run at: " + (date)) $filename 0
writetofile " PUBLICATIONS ON $sqlserver" $filename 1
writetofile " TRANSACTIONAL PUBLICATIONS ($Count_Tran_Pub)" $filename 1

foreach($replicateddatabase in $repsvr.ReplicationDatabases)
{
if ($replicateddatabase.TransPublications.Count -gt 0)
{
foreach($tranpub in $replicateddatabase.TransPublications)
{
write-host "********************************************************************************" -Foregroundcolor Blue
"***** Writing to file script for publication: " + $tranpub.Name
write-host "********************************************************************************" -Foregroundcolor Blue
writetofile "********************************************************************************" $filename 0
writetofile ("***** Writing to file script for publication: " + $tranpub.Name) $filename 0
writetofile "********************************************************************************" $filename 0
[string] $myscript=$tranpub.script($scriptargs)
writetofile $myscript $filename 0
}
}
}

writetofile " MERGE PUBLICATIONS ($Count_Merge_Pub)" $filename 1
writetofile "" $filename 0

foreach($replicateddatabase in $repsvr.ReplicationDatabases)
{
if ($replicateddatabase.MergePublications.Count -gt 0)
{
foreach($mergepub in $replicateddatabase.MergePublications)
{
write-host "********************************************************************************" -Foregroundcolor Blue
"***** Writing to file script for publication: " + $mergepub.Name
write-host "********************************************************************************" -Foregroundcolor Blue
writetofile "********************************************************************************" $filename 0
writetofile ("***** Writing to file script for publication: " + $mergepub.Name) $filename 0
writetofile "********************************************************************************" $filename 0
[string] $myscript=$mergepub.script($scriptargs)
writetofile $myscript $filename 0
}
}
}
15 июн 12, 21:32    [12723100]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить