GMan_LDN

install2

Apr 23rd, 2023 (edited)
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PowerShell 15.20 KB | Software | 0 0
  1. [CmdletBinding()]
  2. param (
  3.  
  4.     [Parameter(Mandatory = $true)]
  5.     [string]
  6.     $PublicationDB,
  7.  
  8.     [string]
  9.     $PublicationServer,
  10.  
  11.     [Parameter(Mandatory = $true)]
  12.     [string]
  13.     $PublicationName,
  14.  
  15.     [string]
  16.     $SubscriberServer = "",
  17.  
  18.     [Parameter(Mandatory = $true)]
  19.     [string]
  20.     $SubscriberDB,
  21.  
  22.     [string]
  23.     $SubscriberLogin = "",
  24.  
  25.     [string]
  26.     $SubscriberPassword = "",
  27.  
  28.     #Optional SQL Login
  29.     [Parameter()]
  30.     [string]
  31.     $PublicationDBUsername,
  32.  
  33.     #Optional SQL Login password
  34.     [Parameter()]
  35.     [string]
  36.     $PublicationDBPassword,
  37.  
  38.     [string]
  39.     $DataFolderPath = "",
  40.  
  41.     [string]
  42.     $LogFolderPath = "",
  43.  
  44.     [string]
  45.     $SnapshotFolderPath = "",
  46.  
  47.     [Parameter(Mandatory = $true)]
  48.     [string]
  49.     $ReportingUserPassword,
  50.  
  51.     [Parameter(Mandatory = $true)]
  52.     [string]
  53.     $PublicationType,
  54.  
  55.     [Parameter(Mandatory = $true)]
  56.     [string]
  57.     $CreateSnapshot,
  58.  
  59.     [Parameter()]
  60.     [string]
  61.     $IncludeObjects,
  62.  
  63.     [Parameter()]
  64.     [string]
  65.     $ExcludeObjects
  66. )
  67.  
  68. try {
  69.  
  70.     #Clear standard out
  71.     Clear-Host
  72.  
  73.     Set-Variable MaximumHistoryCount 32767
  74.  
  75.     if ($PublicationServer -eq "") {
  76.         $PublicationServer = $env:ComputerName
  77.     }
  78.  
  79.     if ($SubscriberServer -eq "") {
  80.         $SubscriberServer = $env:ComputerName
  81.     }
  82.  
  83.     if ($PublicationServer -eq "") {
  84.         $PublicationServer = $env:ComputerName
  85.     }
  86.  
  87.     if ($SubscriberServer -eq "") {
  88.         $SubscriberServer = $env:ComputerName
  89.     }
  90.  
  91.  
  92.     Write-Host "STARTING: Install.ps1 - Here are the variables..."
  93.     Write-Host "PRINTING VARIABLES - PublicationDB: $PublicationDB"
  94.     Write-Host "PRINTING VARIABLES - PublicationServer: $PublicationServer"
  95.     Write-Host "PRINTING VARIABLES - PublicationName: $PublicationName"
  96.     Write-Host "PRINTING VARIABLES - SubscriberServer: $SubscriberServer"
  97.     Write-Host "PRINTING VARIABLES - SubscriberDB: $SubscriberDB"
  98.     Write-Host "PRINTING VARIABLES - SubscriberLogin: $SubscriberLogin"
  99.     Write-Host "PRINTING VARIABLES - SubscriberPassword: $SubscriberPassword"
  100.     Write-Host "PRINTING VARIABLES - PublicationDBUsername: $PublicationDBUsername"
  101.     Write-Host "PRINTING VARIABLES - PublicationDBPassword: $PublicationDBPassword"
  102.     Write-Host "PRINTING VARIABLES - LogFolderPath: $LogFolderPath"
  103.     Write-Host "PRINTING VARIABLES - DataFolderPath: $DataFolderPath"
  104.     Write-Host "PRINTING VARIABLES - SnapshotFolderPath: $SnapshotFolderPath"
  105.     Write-Host "PRINTING VARIABLES - ReportingUserPassword: $ReportingUserPassword"
  106.     Write-Host "PRINTING VARIABLES - PublicationType: $PublicationType"
  107.     Write-Host "PRINTING VARIABLES - CreateSnapshot: $CreateSnapshot"
  108.     Write-Host "PRINTING VARIABLES - IncludeObjects: $IncludeObjects"
  109.     Write-Host "PRINTING VARIABLES - ExcludeObjects: $ExcludeObjects"
  110.  
  111.     if (Get-Module -ListAvailable -Name SQLServer) {
  112.         Write-Host "SUCCESS: SQLServer Module exists"
  113.     }
  114.     else {
  115.         throw "FAILURE: SQLServer Module does not exist"
  116.     }
  117.  
  118.     #Sets up the variable array for params which might not be passed explicity
  119.  
  120.     $vars = "PublicationDB=$PublicationDB",
  121.     "PublicationServer=$PublicationServer",
  122.     "PublicationName=$PublicationName",
  123.     "SubscriberServer=$SubscriberServer",
  124.     "SubscriberDB=$SubscriberDB",
  125.     "ReportingUserPassword=$ReportingUserPassword",
  126.     "LogFolderPath=$LogFolderPath",
  127.     "DataFolderPath=$DataFolderPath",
  128.     "SnapshotFolderPath=$SnapshotFolderPath",
  129.     "PublicationType=$PublicationType",
  130.     "CreateSnapshot=$CreateSnapshot",
  131.     "IncludeObjects='$IncludeObjects'",
  132.     "ExcludeObjects='$ExcludeObjects'"
  133.  
  134.     if ($SubscriberLogin -and $SubscriberLogin -ne '' -and $SubsciberPassword -and $SubscriberPassword -ne '') {
  135.         $vars += "SubscriberLogin=$SubscriberLogin"
  136.         $vars += "SubscriberPassword=$SubscriberPassword"
  137.     }
  138.            
  139.     Write-Output "VARIABLE LIST IS: $vars"
  140.  
  141.     #Server name should always be the server it's running on as the package will only exist on
  142.     #the target box.
  143.     Write-Output "Publication Server is: $PublicationServer"
  144.  
  145. #Set up connection strings for pub
  146. if ($PublicationDBUsername -and $PublicationDBPassword -and $PublicationDBUsername -ne '' -and $PublicationDBPassword -ne '') {
  147.     $ConnectionString = "Data Source=$PublicationServer;Database=$PublicationDB;Integrated Security=false;User ID=$PublicationDBUsername;Password=$PublicationDBPassword;Connection Timeout=0;Trust Server Certificate=True"
  148. }
  149. else {
  150.     $ConnectionString = "Data Source=$PublicationServer;Database=$PublicationDB;Integrated Security=true;Connection Timeout=0;Trust Server Certificate=True"
  151. }
  152.  
  153. #Set up connection strings sub
  154. if ($SubscriberLogin -and $SubscriberPassword -and $SubscriberLogin -ne '' -and $SubscriberPassword -ne '') {
  155.     $SubConnectionString = "Data Source=$SubscriberServer;Database=$SubscriberDB;Integrated Security=false;User ID=$SubscriberDBUsername;Password=$SubscriberPassword;Connection Timeout=0;Trust Server Certificate=True"
  156.     #Convert Subscriber login to SecureString
  157.     [securestring]$SecSubsPassword = ConvertTo-SecureString $SubscriberPassword -AsPlainText -Force
  158.  
  159.     #Create credentials object
  160.     [pscredential]$SubscriberCredObject = New-Object -TypeName PSCredential -ArgumentList $SubscriberLogin, $SecSubsPassword
  161. }
  162. else {
  163.     $SubConnectionString = "Data Source=$SubscriberServer;Database=$SubscriberDB;Integrated Security=true;Connection Timeout=0;Trust Server Certificate=True"
  164. }
  165.  
  166.  
  167. #This function intelligently applies table to the subscriber
  168. function Write-SRSTableDataToSubscriber {
  169.  
  170.     param
  171.     (
  172.         #This is a list of schema names to apply to [dbo].[SchemaCompare_SRS] on subscriber
  173.         [Parameter(Mandatory = $true)]
  174.         [System.Data.DataTable]      
  175.         $TableDataInputVariable,
  176.        
  177.         [Parameter(Mandatory = $true)]
  178.         [string]  
  179.         $SubscriberServer,
  180.  
  181.         [Parameter(Mandatory = $true)]
  182.         [string]      
  183.         $SubscriberDB,
  184.  
  185.         [string]
  186.         $SubscriberLogin = "",
  187.  
  188.         [string]      
  189.         $SubscriberPassword = ""
  190.     )
  191.  
  192.     Write-Host "PRINT: TableDataVariables..."
  193.     $TableDataInputVariable | Format-Table
  194.     Write-Host "PRINT: SubscriberServer: $SubscriberServer"
  195.     Write-Host "PRINT: SubscriberDB: $SubscriberDB"
  196.     Write-Host "PRINT: SubscriberLogin: $SubscriberLogin"
  197.     Write-Host "PRINT: SubscriberPassword: $SubscriberPassword"
  198.  
  199.     #Set up connection strings sub
  200.     if ($SubscriberUsername -and $SubscriberPassword -and $SubscriberUsername -ne '' -and $SubscriberPassword -ne '') {
  201.         $SubConnectionString = "Data Source=$SubscriberServer;Database=$SubscriberDB;Integrated Security=false;User ID=$SubscriberUsername;Password=$SubscriberPassword;Connection Timeout=0;Trust Server Certificate=True"
  202.     }
  203.     else {
  204.         $SubConnectionString = "Data Source=$SubscriberServer;Database=$SubscriberDB;Integrated Security=true;Connection Timeout=0;Trust Server Certificate=True"
  205.     }
  206.  
  207.     #Drop and recreate the target schema
  208.     $DropSchemaTableSQLString = "DROP TABLE IF EXISTS [dbo].[SchemaCompare_SRS];"
  209.     $CreateSchemaTableSQLString = "CREATE TABLE [dbo].[SchemaCompare_SRS] ([Name] NVARCHAR(255));"
  210.  
  211.     foreach ($row in $TableDataInputVariable) {
  212.         $WriteSQLString += "INSERT INTO [dbo].[SchemaCompare_SRS] ([Name]) VALUES ('$($row[0].ToString())');"
  213.     }
  214.  
  215.     Write-Output "The SQL Schema compare string to run is..."
  216.     Write-Output $DropSchemaTableSQLString
  217.     Write-Output $CreateSchemaTableSQLString
  218.     Write-Output $WriteSQLString
  219.  
  220.     try {
  221.  
  222.         #Write schema rows to subscriber
  223.         Write-Output "STARTING: SRS WriteTable"
  224.  
  225.         Invoke-SqlCmd -ConnectionString $SubConnectionString -Query $DropSchemaTableSQLString -Verbose -ErrorAction Stop
  226.         Invoke-SqlCmd -ConnectionString $SubConnectionString -Query $CreateSchemaTableSQLString -Verbose -ErrorAction Stop
  227.         Invoke-SqlCmd -ConnectionString $SubConnectionString -Query $WriteSQLString -Verbose -ErrorAction Stop
  228.  
  229.         Write-Output "SUCCESS: SRS WriteTable"
  230.     }
  231.     catch {
  232.         throw
  233.     }
  234. }
  235.  
  236. #Get publisher collation
  237. $PublisherQuery = "SELECT [collation_name] AS Collation FROM [sys].[databases] WHERE name = '$PublicationDB'"
  238.  
  239. #Query run at publisher
  240. Write-Output "Starting Running query on publisher: $PublisherQuery"
  241. Write-Output "Command is: $PublicationCollation"
  242. $PublicationCollation = Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $PublisherQuery -Verbose -Querytimeout 0
  243. Write-Output "Finished Running query on publisher"
  244.  
  245. #Get subscriber collation
  246.  
  247. $ObjectExecuted = $false
  248. $SubscriberQuery = "SELECT [collation_name] AS Collation FROM [sys].[databases] WHERE name = '$SubscriberDB'"
  249.        
  250. #Query run at subscriber
  251. if ($SubscriberLogin -and $SubscriberPassword -and $SubscriberLogin -ne '' -and $SubscriberPassword -ne '') {
  252.     Write-Output "Starting Running query on subscriber SQL Auth: $SubscriberQuery"
  253.     Write-Output "Invoke-Sqlcmd -ServerInstance $SubscriberServer -Database $SubscriberDB -Credential $SubscriberCredObject -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop"
  254.     $SubscriptionCollation = Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop
  255.     Write-Output "Finished Running query on subscriber"
  256. }
  257. else {
  258.     Write-Output "Starting Running query on subscriber NTLM auth: $SubscriberQuery"
  259.     Write-Output "Invoke-Sqlcmd -ServerInstance $SubscriberServer -Database $SubscriberDB -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop"
  260.     $SubscriptionCollation = (Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop)
  261.     Write-Output "Finished Running query on subscriber"
  262. }
  263. $ObjectExecuted = $false
  264. $SubscriberQuery = "SELECT [collation_name] AS Collation FROM [sys].[databases] WHERE name = '$SubscriberDB'"
  265.        
  266. #Query run at subscriber
  267. if ($SubscriberLogin -and $SubscriberPassword -and $SubscriberLogin -ne '' -and $SubscriberPassword -ne '' -and !$ObjectExecuted) {
  268.     Write-Output "Starting Running query on subscriber SQL Auth: $SubscriberQuery"
  269.     Write-Output "Invoke-Sqlcmd -ServerInstance $SubscriberServer -Database $SubscriberDB -Credential $SubscriberCredObject -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop"
  270.     $SubscriptionCollation = Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop
  271.     Write-Output "Finished Running query on subscriber"
  272.     $ObjectExecuted = $true
  273. }
  274. elseif (!$ObjectExecuted) {
  275.     Write-Output "Starting Running query on subscriber NTLM auth: $SubscriberQuery"
  276.     Write-Output "Invoke-Sqlcmd -ServerInstance $SubscriberServer -Database $SubscriberDB -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop"
  277.     $SubscriptionCollation = (Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $SubscriberQuery -Verbose -Querytimeout 0 -ErrorAction Stop)
  278.     Write-Output "Finished Running query on subscriber"
  279.     $ObjectExecuted = $true
  280. }
  281.  
  282. #Assign collation to variable
  283. $PublisherCollation = $PublicationCollation.Collation
  284. $SubscriberCollation = $SubscriptionCollation.Collation
  285.  
  286. Write-Output "Publisher collation is: $PublisherCollation"
  287. Write-Output "Subscriber collation is: $SubscriberCollation"
  288.  
  289. #Compare collation
  290. if ($PublisherCollation -ne $SubscriberCollation) {
  291.     Write-Error -Message "FAILURE: Subscriber database has different collation than publisher."
  292.     break
  293. }
  294.  
  295.  
  296. Write-Output "FINISHED: Getting collations.."
  297.  
  298. Write-Output "STARTING: Getting schemas.."
  299. #Get DB schema from publisher and write it to a table on subscriber
  300.  
  301. $SchemaQuery = "SELECT [name] FROM [sys].[schemas]"
  302.  
  303. #Query run at publisher SQL Login
  304. if ($PublicationDBUsername -and $PublicationDBPassword -and $PublicationDBUsername -ne '' -and $PublicationDBPassword -ne '') {
  305.        
  306.     Write-Output "Starting Running query on publisher SQL Auth and save results on subcriber: $SchemaQuery"
  307.     $TableDataInputVariable = (Invoke-Sqlcmd -ServerInstance $PublicationServer -Database $PublicationDB -Username $PublicationDBUsername -Password $PublicationDBPassword -Query $SchemaQuery -OutputAs "DataTables" -Verbose -Querytimeout 0 -ErrorAction Stop)
  308.     Write-Output "Finished Running query"
  309. }
  310.  
  311. #Query run at publisher NTLM Login
  312. else {
  313.  
  314.     Write-Output "Starting Running on Publisher NTLM Auth and save results on subcriber: $SchemaQuery"
  315.     $TableDataInputVariable = (Invoke-Sqlcmd -ConnectionString $ConnectionString -Query $SchemaQuery -OutputAs "DataTables" -Verbose -Querytimeout 0 -ErrorAction Stop)
  316.     Write-Output "Finished Running query"
  317. }
  318.  
  319. if ($SubscriberLogin -and $SubscriberPassword -and $SubscriberLogin -ne '' -and $SubscriberPassword -ne '') {
  320.  
  321.     Write-SRSTableDataToSubscriber -TableDataInputVariable $TableDataInputVariable -SubscriberServer $SubscriberServer -SubscriberDB $SubscriberDB -SubscriberLogin $SubscriberLogin -SubscriberPassword $SubscriberPassword
  322.    
  323. }
  324. else {
  325.     Write-SRSTableDataToSubscriber -TableDataInputVariable $TableDataInputVariable -SubscriberServer $SubscriberServer -SubscriberDB $SubscriberDB
  326. }
  327.  
  328. # Create the snapshot folder if it doesn't exist
  329. if (-not (Test-Path -Path $SnapshotFolderPath)) {
  330.     New-Item -Path $SnapshotFolderPath -ItemType Directory -ErrorAction Stop
  331.     Write-Output "Successfully created snapshot folder: $SnapshotFolderPath"
  332. }
  333.  
  334. #Get the scripts
  335. Write-Output "Retrieving Scripts..."
  336.  
  337. #**************************
  338. #NB - Filenames containing RAS are run on the sunscriber!
  339. #**************************
  340.  
  341.  
  342. # Read the contents of the order file into an array of strings
  343. # Set the path to the order.txt file relative to the script location
  344. $OrderFileLocation = "$PSScriptRoot\..\sql\install_order.txt"
  345.  
  346. #Get script names from the orderfile
  347. $Filenames = Get-Content -path $OrderFileLocation
  348. write-host $filenames
  349.  
  350. $Filenames | ForEach-Object {
  351.  
  352.     $CurrentFileName = $_.ToString()
  353.  
  354.     $scriptfile = join-path "$PSScriptRoot\..\sql\" $CurrentFileName -Resolve
  355.  
  356.     Write-Output "STARTING: Enter the Scriptfile section..."
  357.     Write-Output "STARTING: Variables are: $vars"
  358.  
  359.     #file is run at the publisher
  360.     if ($scriptfile -like "*SETUP*" -and $scriptfile -notlike "*RAS*") {
  361.         Write-Output "Starting Running on Publisher: $scriptfile"
  362.         Invoke-Sqlcmd -ConnectionString $ConnectionString -Inputfile $scriptfile -Variable $vars -Verbose -Querytimeout 0 -ErrorAction Stop
  363.         Write-Output "Finished Running: $scriptfile"
  364.     }
  365.     #File is run at subscriber
  366.     elseif ($Scriptfile -like "*SETUP*" -and $scriptfile -like "*RAS*" ) {
  367.         Write-Output "Starting Running on subscriber: $scriptfile"
  368.         Invoke-Sqlcmd -ConnectionString $SubConnectionString -Inputfile $scriptfile -Variable $vars -Verbose -Querytimeout 0 -ErrorAction Stop
  369.         Write-Output "Finished Running: $scriptfile"
  370.     }
  371. }
  372.  
  373.  
  374. Write-Output "SUCCESS: Scriptfile section complete..."
  375.  
  376.  
  377.  
  378. Write-Output 'SRS Install Complete'
  379.  
  380. catch {
  381.  
  382.     Write-Output $_
  383.     Write-Host $_.ScriptStackTrace
  384.     Write-Error -Message "Building variable list failed" -ErrorAction Stop
  385.     throw
  386.     break
  387. }
  388.  
Add Comment
Please, Sign In to add comment