-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInstall-LatestScratchdb.ps1
More file actions
88 lines (75 loc) · 3.54 KB
/
Install-LatestScratchdb.ps1
File metadata and controls
88 lines (75 loc) · 3.54 KB
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
<#
.SYNOPSIS
Installs or updates Scratch database to the latest version
.DESCRIPTION
This function will create a scratchdb 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/scratch-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 scripts are written using CREATE OR ALTER.
.PARAMETER InstanceName
An array of instance names
.PARAMETER DatabaseName
By default, this will be installed in a database called "scratchdb". If you want to install my DBA database with
a different name, specify it here.
.EXAMPLE
Install-LatestScratchdb AM2Prod
.NOTES
AUTHOR: Andy Mallon
DATE: 20260322
COPYRIGHT: This code is licensed as part of Andy Mallon's Scratch Database. https://github.com/amtwo/scratch-database/blob/master/LICENSE
©2026 ● Andy Mallon ● am2.co
#>
[CmdletBinding()]
param (
[Parameter(Position=0,mandatory=$true)]
[string[]]$InstanceName,
[Parameter(Position=1,mandatory=$false)]
[string]$DatabaseName = 'scratchdb'
)
#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 scratchdb 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
}
#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
}
#Then Triggers
Write-Verbose "`n ***Creating/Updating Triggers `n"
$fileList = Get-ChildItem -Path .\triggers -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#Finally, data
Write-Verbose "`n ***Creating/Updating core data `n"
$fileList = Get-ChildItem -Path .\data -Recurse -Filter *.sql
Foreach ($file in $fileList){
Write-Verbose $file.FullName
Invoke-Sqlcmd -ServerInstance $instance -Database $DatabaseName -InputFile $file.FullName
}
#That's it!
}