function Add-AvailabilityGroupDatabase{
param(
$ServerName,
$Port = 1433,
$DatabaseName,
$AvailabilityGroup
)
begin{
}
process{
if(!$ServerName.Contains('.')){
$ServerName = "$ServerName.$env:USERDNSDOMAIN"
}
$srv = new-object Microsoft.SqlServer.Management.smo.Server "$ServerName,$Port"
$ServerName = $srv.AvailabilityGroups[$AvailabilityGroup].PrimaryReplicaServerName
$srv.ConnectionContext.Disconnect()
$srv = new-object Microsoft.SqlServer.Management.smo.Server "$($ServerName).$env:USERDNSDOMAIN,$Port"
if(!$srv.Databases[$DatabaseName]){
throw "Could not find a database $DatabaseName on primary replica $ServerName"
}
if(!$srv.AvailabilityGroups[$AvailabilityGroup].AvailabilityDatabases.Contains($DatabaseName)){
[void]$srv.ConnectionContext.ExecuteNonQuery("RESTORE DATABASE [$DatabaseName] WITH RECOVERY;");
$ADB = New-Object Microsoft.SqlServer.Management.smo.AvailabilityDatabase($srv.AvailabilityGroups[$AvailabilityGroup], $DatabaseName);
$ADB.Create();
}
else{
Write-Warning "Database $DatabaseName is already an availbility database on server $ServerName."
}
$srv.AvailabilityGroups[$AvailabilityGroup].AvailabilityReplicas | ?{$_.Name -ne $ServerName} | select -expandproperty Name | %{
$name = $_
try{
$sec = new-object Microsoft.SqlServer.Management.smo.Server "$($name).$env:USERDNSDOMAIN,$Port"
$ag = $sec.AvailabilityGroups[$AvailabilityGroup]
if(!$ag.AvailabilityDatabases[$DatabaseName].IsJoined){
$ag.AvailabilityDatabases[$DatabaseName].JoinAvailablityGroup();
}
else{
Write-Warning "Database $DatabaseName is already an availbility database on server $name."
}
}
catch{
Write-Error $_ | fl -Force
}
finally{
$sec.ConnectionContext.Disconnect();
}
}
$srv.ConnectionContext.Disconnect()
}
end{
}
}