SQL Server 2012 Hosting :: Memindahkan SQL Agent Jobs Across Menggunakan Powershell

6428.SQL12_v_rgb

Migrasi pekerjaan dari satu server ke lainnya dapat dengan mudah dilakukan dengan PowerShell. Mari kita telusuri script dibawah ini.

[System.Reflection.Assembly]::LoadWithPartialName( ‘Microsoft.SqlServer.SMO’) | out-null
[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SMOExtended’) | out-null
[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SQLWMIManagement’) | out-null
#get the source server object
$ssrv = new-object (‘Microsoft.SqlServer.Management.Smo.Server’) $sourceserver
#get the destination server object
$dsrv = new-object(‘Microsoft.SqlServer.Management.Smo.Server’) $destinationserver

Variabel $sourceserver menentukan contoh sumber server di mana sebagai variabel $destinationserver menentukan server.Tujuan langkah selanjutnya adalah membuat objek scripting ke script SQL Agent jobs.

# get the scripter object and set relevant properties
$scripter = new-object (‘Microsoft.SqlServer.Management.Smo.Scripter’) $ssrv
$scripter.Options.ScriptDrops = $False
$scripter.Options.WithDependencies = $False
$scripter.Options.IncludeHeaders = $True
$scripter.Options.AppendToFile = $True

Setelah itu angkah berikutnya adalah untuk iterate melalui semua job pada server source.

foreach ($job in $ssrv.JobServer.Jobs) {
$jobname = $job.Name
# change the owner to sa in case job owner at source instance
# doesn’t exists at destination server.
if ($job.Owner -ne ‘sa’) {
$job.OwnerLoginName = ‘sa’
}
#script job only if it doesn’t exists at desitnation server.
$djobs=$dsrv.JobServer.Jobs | Where-Object {$_.name -eq $job.name}

Script di atas beriterasi pada semua job dalam server source, menetapkan pemilik job untuk sa jika tidak sa. Hal ini dilakukan untuk menghindari kesalahan dalam kasus pemilik (login) di server source tidak ada di server tujuan. Untuk menyelaraskan. Mungkin kemungkinan bahwa beberapa job hidup berdampingan di kedua source dan tujuan SQL misalnya untuk bermigrasi pada job yang tidak ada saya saring pada list bersamaan dalam objek $djobs. Langkah berikutnya adalah untuk mengcreate dan script keluar job dari script di atas.

if(!$djobs)
{
# specify the script location
$scripter.Options.FileName = “D:\Ahmad\SQLServerGeeks\Blogs\Powershell\jobs.sql”
$sc=$scripter.Script($job)
#execute the job query on destination server.
$dsrv.ConnectionContext.ExecuteNonQuery($sc[0])

Cek script di atas jika objek $djobs kosong dan jika ya, maka ia menetapkan lokasi skrip dan mendapatkan job script ke objek stringcollection $sc. Job script /query kemudian dieksekusi pada server tujuan menggunakan metode ExecuteNonQuery.