-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathInstall-LatestDbaDatabase.ps1
148 lines (130 loc) · 6.68 KB
/
Install-LatestDbaDatabase.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<#
.SYNOPSIS
Installs or updates DBA database to the latest version
.DESCRIPTION
This function will create a DBA database if it does not already exist, and install the latest code.
This depends on having the full, latest version of the full repo https://github.com/amtwo/dba-database
All dependent .sql files are itempotent:
* Table.sql scripts are written to create if not exists. Changes are maintained similarly as conditional ALTERs.
* code.sql scripst are written to create a stub, then alter with actual code.
.PARAMETER InstanceName
An array of instance names
.PARAMETER DatabaseName
By default, this will be installed in a database called "DBA". If you want to install my DBA database with
a different name, specify it here.
.PARAMETER SkipOSS
By default, this installer assumes that you've got the open source stuff in the right spot. If you don't
want to install those packages, just pass in $true for this, and it'll skip all of them.
.EXAMPLE
Install-LatestDbaDatabase AM2Prod
.NOTES
AUTHOR: Andy Mallon
DATE: 20170922
COPYRIGHT: This code is licensed as part of Andy Mallon's DBA Database. https://github.com/amtwo/dba-database/blob/master/LICENSE
©2014-2020 ● Andy Mallon ● am2.co
#>
[CmdletBinding()]
param (
[Parameter(Position=0,mandatory=$true)]
[string[]]$InstanceName,
[Parameter(Position=1,mandatory=$false)]
[string]$DatabaseName = 'DBA',
[Parameter(Position=2,mandatory=$false)]
[boolean]$SkipOSS = $false
)
#Get Time Zone info from the OS. We'll use this to populate a table later
$TimeZoneInfo = Get-TimeZone -ListAvailable |
Add-Member -MemberType AliasProperty -Name TimeZoneId -Value Id -PassThru | Select-Object TimeZoneId, DisplayName, StandardName, DaylightName, SupportsDaylightSavingTime
# Process servers in a loop. I could do this parallel, but doing it this way is fast enough for me.
foreach($instance in $InstanceName) {
Write-Verbose "**************************************************************"
Write-Verbose " $instance"
Write-Verbose "**************************************************************"
#Create the database - SQL Script contains logic to be conditional & not clobber existing database
Write-Verbose "`n ***Creating Database if necessary `n"
try{
Invoke-Sqlcmd -ServerInstance $instance -Database master -InputFile .\create-database.sql -Variable "DbName=$($DatabaseName)"
}
catch{
Write-Error -Message "Failed creating DBA Database" -ErrorAction Stop
}
#Create tables first
Write-Verbose "`n ***Creating/Updating Tables `n"
$fileList = Get-ChildItem -Path .\tables -Recurse
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName -QueryTimeout 300
}
# Populate the TimeZones table with the object we populated earlier, but only if the table is empty
if((Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -Query 'SELECT RowCnt = COUNT(*) FROM dbo.TimeZones').RowCnt -eq 0){
Write-Verbose "Populating dbo.TimeZones"
Write-SqlTableData -ServerInstance $instance -Database $DatabaseName -SchemaName "dbo" -Table "TimeZones" -InputData $TimeZoneInfo
}
#Then types
Write-Verbose "`n ***Creating/Updating Types `n"
$fileList = Get-ChildItem -Path .\types -Recurse
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName -QueryTimeout 300
}
#Then views
Write-Verbose "`n ***Creating/Updating Views `n"
$fileList = Get-ChildItem -Path .\views -Recurse
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName -QueryTimeout 300
}
#Then scalar functions
Write-Verbose "`n ***Creating/Updating Scalar Functions `n"
$fileList = Get-ChildItem -Path .\functions-scalar -Recurse
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#Then TVFs
Write-Verbose "`n ***Creating/Updating Table-Valued Functions `n"
$fileList = Get-ChildItem -Path .\functions-tvfs -Recurse
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#Then Procedures
Write-Verbose "`n ***Creating/Updating Stored Procedures `n"
$fileList = Get-ChildItem -Path .\stored-procedures -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#Skip Open Source procedures if asked
If ($SkipOSS -eq $false){
#Then First Responder Kit
Write-Verbose "`n ***Creating/Updating First Responder Kit `n"
$fileList = Get-ChildItem -Path .\oss\firstresponderkit -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#Then sp_whoisactive
Write-Verbose "`n ***Creating/Updating sp_WhoIsActive `n"
$fileList = Get-ChildItem -Path .\oss\whoisactive -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database master -InputFile $file.FullName
}
## WOO HOO! Ola's code is idempotent now!
Write-Verbose "`n ***Creating/Updating Ola Hallengren Maintenance Solution `n"
$fileList = Get-ChildItem -Path .\oss\olahallengren -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
## That Erik. He's such a Darling.
Write-Verbose "`n ***Creating/Updating Darling's Dandy Data Troubleshooting scripts `n"
$fileList = Get-ChildItem -Path .\oss\darlingdata -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
}
#That's it!
}